File upload 多部分上传AmazonS3

File upload 多部分上传AmazonS3,file-upload,amazon-web-services,amazon-s3,file-transfer,File Upload,Amazon Web Services,Amazon S3,File Transfer,我正在尝试使用AmazonS3的API上传一个文件。我尝试使用他们的示例代码,它创建了文件的各个部分。现在的问题是,我如何暂停上传,然后继续上传?参见其文档中给出的以下代码: import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.amazonaws.auth.profile.ProfileCredentialsProvider;

我正在尝试使用AmazonS3的API上传一个文件。我尝试使用他们的示例代码,它创建了文件的各个部分。现在的问题是,我如何暂停上传,然后继续上传?参见其文档中给出的以下代码:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.AbortMultipartUploadRequest;
import com.amazonaws.services.s3.model.CompleteMultipartUploadRequest;
import com.amazonaws.services.s3.model.InitiateMultipartUploadRequest;
import com.amazonaws.services.s3.model.InitiateMultipartUploadResult;
import com.amazonaws.services.s3.model.PartETag;
import com.amazonaws.services.s3.model.UploadPartRequest;

public class UploadObjectMPULowLevelAPI {

public static void main(String[] args) throws IOException {
    String existingBucketName  = "*** Provide-Your-Existing-BucketName ***"; 
    String keyName             = "*** Provide-Key-Name ***";
    String filePath            = "*** Provide-File-Path ***";   

    AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider());        

    // Create a list of UploadPartResponse objects. You get one of these
    // for each part upload.
    List<PartETag> partETags = new ArrayList<PartETag>();

    // Step 1: Initialize.
    InitiateMultipartUploadRequest initRequest = new 
         InitiateMultipartUploadRequest(existingBucketName, keyName);
    InitiateMultipartUploadResult initResponse = 
                           s3Client.initiateMultipartUpload(initRequest);

    File file = new File(filePath);
    long contentLength = file.length();
    long partSize = 5242880; // Set part size to 5 MB.

    try {
        // Step 2: Upload parts.
        long filePosition = 0;
        for (int i = 1; filePosition < contentLength; i++) {
            // Last part can be less than 5 MB. Adjust part size.
            partSize = Math.min(partSize, (contentLength - filePosition));

            // Create request to upload a part.
            UploadPartRequest uploadRequest = new UploadPartRequest()
                .withBucketName(existingBucketName).withKey(keyName)
                .withUploadId(initResponse.getUploadId()).withPartNumber(i)
                .withFileOffset(filePosition)
                .withFile(file)
                .withPartSize(partSize);

            // Upload part and add response to our list.
            partETags.add(
                    s3Client.uploadPart(uploadRequest).getPartETag());

            filePosition += partSize;
        }

        // Step 3: Complete.
        CompleteMultipartUploadRequest compRequest = new 
                     CompleteMultipartUploadRequest(
                                existingBucketName, 
                                keyName, 
                                initResponse.getUploadId(), 
                                partETags);

        s3Client.completeMultipartUpload(compRequest);
    } 
    catch (Exception e) 
    {
        s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(
                existingBucketName, keyName, initResponse.getUploadId()));
    }
}
}
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入com.amazonaws.auth.profile.ProfileCredentialsProvider;
导入com.amazonaws.services.s3.AmazonS3;
导入com.amazonaws.services.s3.amazon3Client;
导入com.amazonaws.services.s3.model.AbortMultipartUploadRequest;
导入com.amazonaws.services.s3.model.CompleteMultipartUploadRequest;
导入com.amazonaws.services.s3.model.InitiateMultipartUploadRequest;
导入com.amazonaws.services.s3.model.InitiateMultipartUploadResult;
导入com.amazonaws.services.s3.model.PartETag;
导入com.amazonaws.services.s3.model.UploadPartRequest;
公共类UploadObjectMPULowLevelAPI{
公共静态void main(字符串[]args)引发IOException{
字符串existingBucketName=“***提供您现有的BucketName***”;
String keyName=“***提供密钥名***”;
字符串filePath=“***提供文件路径***”;
AmazonS3 s3Client=新的AmazonS3客户端(新的ProfileCredentialsProvider());
//创建UploadPartResponse对象的列表
//为每个部分上传。
List partETags=newarraylist();
//步骤1:初始化。
InitiateMultipartUploadRequest initRequest=新建
InitiateMultipartUploadRequest(现有BucketName、keyName);
InitiateMultipartUploadResult initResponse=
s3Client.initiateMultipartUpload(初始化请求);
文件文件=新文件(文件路径);
long contentLength=file.length();
long partSize=5242880;//将零件大小设置为5 MB。
试一试{
//步骤2:上传部件。
长文件位置=0;
for(inti=1;filePosition
我还尝试了TransferManager示例,该示例采用Upload对象并调用tryPause(forceCancel)方法。但问题是,每次我尝试暂停它时,它都会被取消


我的问题是,如何将上述代码与暂停和恢复功能结合使用?另外,只是要注意,我也想上传多个具有相同功能的文件。。。。非常感谢您的帮助

如果可以,我认为您应该使用Transfer Manager示例。如果要取消,则很可能无法暂停(使用您正在使用的TransferManager的给定配置)

这可能是因为您暂停得太早,无法使“暂停”表示除取消之外的任何内容,您正在尝试使用加密,或者文件不够大。我相信默认的最小文件大小是16MB。但是,您可以更改TransferManager的配置,以允许您根据tryPause的失败情况暂停,但在加密的情况下除外,我认为您无能为力

如果要为小于该大小的文件启用暂停/恢复,可以在TransferManagerConfiguration中调用setMultipartPloadThreshold(long)方法。如果希望能够提前暂停,可以使用setMinimumUploadPartSize将其设置为使用较小的块


无论如何,如果可能的话,我建议你使用TransferManager,因为它是为你做这类事情的。查看使用tryPause时传输未暂停的原因可能会有所帮助。

TransferManager异步执行上载和下载,并且不会阻止当前线程。调用时,TransferManager会立即返回并引用。您可以使用此参考来查询上载的状态

谢谢你的回复。我尝试过这种方法,但现在它无法恢复上载()。以下是不起作用的步骤:1。一旦来自persistableUpload的信息在文件中序列化,当检索和反序列化数据时,我调用方法transferManager.resumeUpload(persistableUpload);这不会产生错误,但不会做任何事情。