S3分段上传错误代码:MalformedXML

时间:2016-08-06 16:23:45

标签: java amazon-web-services amazon-s3

我使用以下代码将多部分上传到s3。

public boolean uploadFileToS3(List<InputStream> filePartitions ) throws FileException, IOException{



            AWSCredentials credentials = new BasicAWSCredentials("access_key","secret_key");

            String existingBucketName = "bucketName";
            String keyName = "file.log";

            AmazonS3 s3Client = new AmazonS3Client(credentials);

    // 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);





            try {
                // Step 2: Upload parts.

                Iterator its =  filePartitions.iterator();

                int i=0;
                while(its.hasNext()){

                    UploadPartRequest uploadRequest = new UploadPartRequest()
                            .withBucketName(existingBucketName)
                            .withKey(keyName)
                            .withUploadId(initResponse.getUploadId()).withPartNumber(i)
                             .withInputStream((InputStream)its.next());

                    i++;
                    System.out.println("Part " + i + "is uploaded");
                }



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

                s3Client.completeMultipartUpload(compRequest);
            } catch (Exception e) {
                System.out.println("******************************");

                System.out.println(e.getMessage());
                System.out.println(e.getCause()); 
                System.out.println("************************");
                s3Client.abortMultipartUpload(new AbortMultipartUploadRequest(
                        existingBucketName, keyName, initResponse.getUploadId()));
            }




            return true;
        }

运行此代码时,我遇到以下异常。

The XML you provided was not well-formed or did not validate against our published schema (Service: Amazon S3; Status Code: 400; Error Code: MalformedXML; Request ID: C0538A21C25A2DD4)

在上面的代码中,list filePartitions是从一个大文件创建的。 每个块都是20000字节。

我使用以下代码将文件拆分为分区,因为我直接将InputStream数据不是文件。它是一个REST API。

List<InputStream> filePartitions = new ArrayList<InputStream>();

        InputStream inStream = new BufferedInputStream(a_fileInputStream);
        int totalBytesRead = 0;
        int FILE_SIZE = a_fileInputStream.available();
        int chunkSize = 20000;


        while (totalBytesRead < FILE_SIZE) {

            int bytesRemaining = FILE_SIZE - totalBytesRead;

            if (bytesRemaining < chunkSize) {
                chunkSize = bytesRemaining;
            }

            byte[] buffer=new byte[chunkSize];
            //Temporary Byte Array
            int read = inStream.read(buffer,0,chunkSize);
            int bytesRead = inStream.read(buffer, 0, chunkSize);

            if (bytesRead > 0) // If bytes read is not empty
            {
                totalBytesRead += bytesRead;

                //create InputStream from temporary byte array
                InputStream partition = new ByteArrayInputStream(buffer);
                filePartitions.add(partition);

            }

        }

        return filePartitions;

0 个答案:

没有答案