2017-11-17 18 views
0

spring mvc rest apiを使用してaws-s3バケットにファイルをアップロードしようとしています。ここではここファイルがs3バケットにアップロードされていません

[default] 
aws_access_key_id = Access key id 
aws_secret_access_key = secret access key 

S3バケットにアクセスするための私の資格情報の形式は、私のJavaコードがあるさ:

@RestController 
public class UploadController { 

private static String bucketName= "mp4-upload-1"; 
private static String keyName= "secret access key"; 
public static final Logger logger=LogManager.getLogger(UploadController.class); 

@RequestMapping(value="/uploadVideo", method = RequestMethod.POST, consumes=MediaType.MULTIPART_FORM_DATA_VALUE) 
public ResponseEntity<String> uploadVideo(@RequestParam("file") MultipartFile file) throws IOException { 


    AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); 
    try { 
     System.out.println("Uploading a new object to S3 from a file\n"); 

     InputStream is=file.getInputStream(); 

     s3client.putObject(new PutObjectRequest(bucketName, keyName,is,new ObjectMetadata()).withCannedAcl(CannedAccessControlList.PublicRead)); 


    } catch (AmazonServiceException ase) { 
     System.out.println("Caught an AmazonServiceException, which " + 
       "means your request made it " + 
       "to Amazon S3, but was rejected with an error response" + 
       " for some reason."); 
     System.out.println("Error Message: " + ase.getMessage()); 
     System.out.println("HTTP Status Code: " + ase.getStatusCode()); 
     System.out.println("AWS Error Code: " + ase.getErrorCode()); 
     System.out.println("Error Type:  " + ase.getErrorType()); 
     System.out.println("Request ID:  " + ase.getRequestId()); 
    } catch (AmazonClientException ace) { 
     System.out.println("Caught an AmazonClientException, which " + 
       "means the client encountered " + 
       "an internal error while trying to " + 
       "communicate with S3, " + 
       "such as not being able to access the network."); 
     System.out.println("Error Message: " + ace.getMessage()); 
    } 
    return new ResponseEntity<>(HttpStatus.OK); 

} 

}

問題は、私はすべてのエラーを取得していないのですが、ファイルをS3にアップロードされていないです-バケツ。私はここに何かを逃していますか事前に感謝します

+2

本当の資格情報ですか?すぐに削除することをお勧めします。 – realharry

+0

それを削除するだけではなく、そのキーを無効にしてください。通常、人々はAWSクレデンシャルを探してEC2インスタンスをたくさんスピンアップするカスタムスクリプトをいくつか持っています。 – Ian

+0

ここから資格情報を削除し、新しい鍵を生成します(他の場所で共有しないでください)。したがって、資格情報を必要とせずに、依然として問題を検討することができます。 –

答えて

0

ストリームがS3に直接アップロードされるとき、コンテンツの長さはリクエストで指定する必要があります。入力ストリームから直接アップロードする際のデータはアマゾンS3にアップロードすることができます前に、コンテンツの長さが を指定する必要があります

ObjectMetadata objMetadata = new ObjectMetadata() 
objMetadata.setContentLength(20L); 

。提供されていない場合、 ライブラリは入力ストリームの内容を オーダにバッファして計算する必要があります。 Amazon S3は、いずれかのデータが送信される前に、コンテンツヘッダ をリクエストヘッダで送信することを明示的に要求しています。

Refer this for content length calculation

代替アプローチ: -

使用org.springframework.util.FileCopyUtils.copyToByteArray()byte[]にストリームを変換し、S3へのバイト配列をアップロードします。

+0

こんにちは私のコードは今働いています。問題は、間違った場所に資格情報を置いたことでした。しかし、今回はIAMユーザーを作成してaccess_key_idとsecret_access_keyを取得し、ホームディレクトリに配置するのではなくコード内でこの資格情報を管理しました。とにかくあなたの提案に感謝します。 –

関連する問題