2

これは私が InputStream に書き込むために行うことです

public OutputStream getOutputStream(@Nonnull final String uniqueId) throws PersistenceException {
        final PipedOutputStream outputStream = new PipedOutputStream();
        final PipedInputStream inputStream;
        try {
            inputStream = new PipedInputStream(outputStream);
            new Thread(
                    new Runnable() {
                        @Override
                        public void run() {
                            PutObjectRequest putObjectRequest = new PutObjectRequest("haritdev.sunrun", "sample.file.key", inputStream, new ObjectMetadata());
                            PutObjectResult result = amazonS3Client.putObject(putObjectRequest);
                            LOGGER.info("result - " + result.toString());
                            try {
                                inputStream.close();
                            } catch (IOException e) {

                            }
                        }
                    }
            ).start();
        } catch (AmazonS3Exception e) {
            throw new PersistenceException("could not generate output stream for " + uniqueId, e);
        } catch (IOException e) {
            throw new PersistenceException("could not generate input stream for S3 for " + uniqueId, e);
        }
         try {
            return new GZIPOutputStream(outputStream);
        } catch (IOException e) {
            LOGGER.error(e.getMessage(), e);
            throw new PersistenceException("Failed to get output stream for " + uniqueId + ": " + e.getMessage(), e);
        }
    }

次のメソッドでは、プロセスが死んでいるのがわかります

protected <X extends AmazonWebServiceRequest> Request<X> createRequest(String bucketName, String key, X originalRequest, HttpMethodName httpMethod) {
    Request<X> request = new DefaultRequest<X>(originalRequest, Constants.S3_SERVICE_NAME);
    request.setHttpMethod(httpMethod);
    if (bucketNameUtils.isDNSBucketName(bucketName)) {
        request.setEndpoint(convertToVirtualHostEndpoint(bucketName));
        request.setResourcePath(ServiceUtils.urlEncode(key));
    } else {
        request.setEndpoint(endpoint);

        if (bucketName != null) {
            /*
             * We don't URL encode the bucket name, since it shouldn't
             * contain any characters that need to be encoded based on
             * Amazon S3's naming restrictions.
             */
            request.setResourcePath(bucketName + "/"
                    + (key != null ? ServiceUtils.urlEncode(key) : ""));
        }
    }

    return request;
}

プロセスはrequest.setResourcePath(ServiceUtils.urlEncode(key));で失敗します。キーが有効な名前でNULLではないにもかかわらず、そのためにデバッグすることさえできません

誰か助けてくれませんか?

request死ぬ前はこんな感じ

request = {com.amazonaws.DefaultRequest@1931}"PUT https://my.bucket.s3.amazonaws.com / "
resourcePath = null
parameters = {java.util.HashMap@1959} size = 0
headers = {java.util.HashMap@1963} size = 0
endpoint = {java.net.URI@1965}"https://my.bucket.s3.amazonaws.com"
serviceName = {java.lang.String@1910}"Amazon S3"
originalRequest = {com.amazonaws.services.s3.model.PutObjectRequest@1285}
httpMethod = {com.amazonaws.http.HttpMethodName@1286}"PUT"
content = null
4

2 に答える 2

1

私は同じアプローチを試みましたが、私にとっても失敗しました。

最初にすべてのデータを出力ストリームに書き込み、出力ストリームから入力ストリームにデータをコピーした後、S3 へのアップロードを開始しました。

...
// Data written to outputStream here
...
byte[] byteArray = outputStream.toByteArray();
amazonS3Client.uploadPart(new UploadPartRequest()
  .withBucketName(bucket)
  .withKey(key)
  .withInputStream(new ByteArrayInputStream(byteArray))
  .withPartSize(byteArray.length)
  .withUploadId(uploadId)
  .withPartNumber(partNumber));

S3へのアップロードを開始する前に、データブロック全体をメモリに書き込んでコピーする必要がある場合、ストリームへの書き込みの目的を無効にしますが、それが機能させる唯一の方法です。

于 2013-06-14T05:46:14.030 に答える