java - 使用 AmazonS3Client java 在 S3 上上传文件

标签 java file-upload amazon-s3 multipart

我正在使用第三方服务器,它会返回以下内容。 1)网址 2)访问控制列表 3)政策 4)awsAccesskeyID 5)签名 6) key 我可以使用以下代码上传文件

final File localFile = new File(localFilePath);

final Part[] parts = { new StringPart("acl", acl),
    new StringPart("policy", policy),
    new StringPart("AWSAccessKeyId", awsAccessKeyId),
    new StringPart("signature", signature),
    new StringPart("key", key, HTTP.UTF_8), 
    new FilePart("file", localFile) };

    final MultipartRequestEntity mpRequestEntity = new MultipartRequestEntity(parts, filePost.getParams());

    filePost.setRequestEntity(mpRequestEntity);
    final HttpClient client = new HttpClient();
    try
    {

       status = client.executeMethod(filePost);
    }

但现在我想使用 AmazonS3Client 使用以下代码,但它抛出异常

10-31 16:21:36.070: INFO/com.amazonaws.request(13882): Received error response: Status Code: 403, AWS Request ID: 51F7CB27E58F88FD, AWS Error Code: SignatureDoesNotMatch, AWS Error Message: The request signature we calculated does not match the signature you provided. Check your key and signing method., S3 Extended Request ID: YwNNsWOXg71vXY1VS0apHnHpHp4YVWRJ63xm8C7w36SYg1MNuIykw75YhQco5Lk7

        final AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(awsAccessKeyId, key));


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

        // Step 1: Initialize.
        final InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(targetURL, key);
        final InitiateMultipartUploadResult initResponse = s3Client.initiateMultipartUpload(initRequest);

        final File file = new File(localFilePath);
        final 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.
                final UploadPartRequest uploadRequest = new UploadPartRequest().withBucketName(targetURL).withKey(key)
                        .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.
            final CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(targetURL, key,
                    initResponse.getUploadId(), partETags);

            s3Client.completeMultipartUpload(compRequest);
        }
        catch ( final Exception e )
        {
            s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(targetURL, key, initResponse.getUploadId()));
            return false;
        }
        return true;

我在这里遗漏了什么吗?

最佳答案

我发现服务器一次性发送签名来上传文件。在分段上传的情况下,需要多个签名,并且在各个步骤中都需要签名。 在服务器共享 key 之前,无法分部分上传文件:(。

http://dextercoder.blogspot.in/2012/02/multipart-upload-to-amazon-s3-in-three.html

关于java - 使用 AmazonS3Client java 在 S3 上上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7952818/

相关文章:

javascript - 如何取消由 jQuery 中的 ajaxSubmit() 启动的文件上传?

amazon-s3 - boto s3 连接 - 使用什么端口?

c# - 如何使用 Lambda 从 SQS 中提取 S3 事件信息

java - AWS S3 查询字符串请求身份验证备选上传文件

java - Retrofit 2 中同步请求和异步请求哪个更好

python - 访问自定义 Django 上传处理程序中的其他表单字段

javascript - 将网站表单连接到(编译的)java/common lisp 程序(网站作为 UI)

file - dot net nuke 上传文件

java - SSLPeerUnverifiedException : peer not authenticated in Netty with self signed certificates on separates machines

java - 给组件添加JComponents可能会出现什么问题