**文件管理** ############################## 在NOS中,用户可以通过一系列的接口管理桶(Bucket)中的文件(Object),比如ListObjects,DeleteObject,CopyObject,DoesObjectExist等。 列出桶中的文件 ============================= 您可以使用S3Client.ListObjects列出存储中间中的文件:: void listObjectsWithPrintKeySize(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName){ Aws::S3::Model::ListObjectsRequest listObjectRequest; listObjectRequest.WithBucket(bucketName); auto result = s3Client.ListObjects(listObjectRequest); if (result.IsSuccess()) { for(auto content : result.GetResult().GetContents()){ std::cout << content.GetKey() << " --> " << content.GetSize() << std::endl; } } else { std::cout << "list Objects failed" << std::endl; } } 上述代码中的ListObjectsRequest中的可选参数如下所示: +------------------------+-------------------------------------------------------------------------------------------------------------------------+ |参数 | 说明 | +========================+=========================================================================================================================+ | Delimiter |用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素。限制长度为10。 | +------------------------+-------------------------------------------------------------------------------------------------------------------------+ | Prefix |限定返回的object key必须以prefix作为前缀。注意使用prefix查询时,返回的key中仍会包含prefix | +------------------------+-------------------------------------------------------------------------------------------------------------------------+ | MaxKeys |限定此次返回object的最大数,如果不设定,默认为100 | +------------------------+-------------------------------------------------------------------------------------------------------------------------+ | Marker |设定结果从marker之后按字母排序的第一个开始返回 | +------------------------+-------------------------------------------------------------------------------------------------------------------------+ .. note:: 1. 上述表中的参数都是可选参数 判断文件是否存在 ============================ 您可以使用S3Client.GetObjectMetadata的返回值来判断文件是否存在:: bool doesObjectExits(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::String& objectName){ Aws::S3::Model::HeadObjectRequest headObjectRequest; headObjectRequest.WithBucket(bucketName).WithKey(objectName); auto result = s3Client.HeadObject(headObjectRequest); return result.IsSuccess(); } 删除单个文件 =========================== 您可以使用S3Client.DeleteObject删除单个需要删除的文件:: void deleteObject(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::String& objectName){ Aws::S3::Model::DeleteObjectRequest object_request; object_request.WithBucket(bucketName).WithKey(objectName); auto delete_object_outcome = s3Client.DeleteObject(object_request); if (delete_object_outcome.IsSuccess()) { std::cout << "Done!" << std::endl; } else { std::cout << "DeleteObject error: " << delete_object_outcome.GetError().GetExceptionName() << " " << delete_object_outcome.GetError().GetMessage() << std::endl; } } 删除多个文件 ============================ 您可以使用S3Client.DeleteObjects批量删除文件:: void deleteObjects(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::Vector& objectNames){ Aws::S3::Model::DeleteObjectsRequest deleteObjectsRequest; Aws::S3::Model::Delete deleteObjects; deleteObjects.SetObjects(objectNames); deleteObjects.SetQuiet(false); deleteObjectsRequest.WithBucket(bucketName).WithDelete(deleteObjects); auto result = s3Client.DeleteObjects(deleteObjectsRequest); if (result.IsSuccess()) { for(auto err : result.GetResult().GetErrors()){ std::cout << "delete err : " << err.GetKey() << " --> " << err.GetMessage() << std::endl; } for (auto del : result.GetResult().GetDeleted()) { std::cout << "delete ok : " << del.GetKey() << std::endl; } std::cout << "ok" << std::endl; } else { std::cout << result.GetError().GetMessage() << std::endl; std::cout << "failed" << std::endl; } } 拷贝文件 =========================== 您可以使用S3Client.CopyObject拷贝文件:: void copyObject(const Aws::S3::S3Client& s3Client,const Aws::String& srcBucket,const Aws::String& srcObject,const Aws::String& dstBucket,const Aws::String& dstObject){ Aws::S3::Model::CopyObjectRequest copyObjectRequest; copyObjectRequest.WithBucket(dstBucket).WithKey(dstObject).WithCopySource("/" + srcBucket + "/" + srcObject); auto result = s3Client.CopyObject(copyObjectRequest); if (result.IsSuccess()) { std::cout << "copy done" << std::endl; } else { std::cout << "copy failed" << std::endl; } } .. attention:: 1. 支持跨桶的文件copy 获取文件的文件元信息 ========================== 您可以使用S3Client.GetObjectMetadata获取对象的元数据信息:: void getObjectMeta(const Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::String& objectName){ Aws::S3::Model::HeadObjectRequest headObjectRequest; headObjectRequest.WithBucket(bucketName).WithKey(objectName); auto result = s3Client.HeadObject(headObjectRequest); if (result.IsSuccess()) { for(auto entry : result.GetResult().GetMetadata()){ std::cout << entry.first << " -- > " << entry.second << std::endl; } } else { std::cout << "failed" << std::endl; } } 生成私有对象可下载的URL链接 ============================= 您可以使用S3Client.GetPreSignedURL获取对象的下载URL:: void getObjectDonwloadUrl(Aws::S3::S3Client& s3Client,const Aws::String& bucketName,const Aws::String& objectName){ Aws::String url = s3Client.GeneratePresignedUrl(bucketName, objectName,Aws::Http::HttpMethod::HTTP_GET,20);//最后一个20是过期时间,但是为second std::cout << url << std::endl; }