Amazon S3 サービスのクライアント、
com.amazonaws.service.s3.AmazonS3
で、InputStream から S3 にアップロードする時、
com.amazonaws.service.s3.model.ObjectMetadata にセットする
長さ=content Length をわからない時に、どうやって調べて指定すれば、良いのかという問題
出くわしました。
仮に指定しないで、アップロード実行すると、成功はするものの、標準エラー出力で、
WARNING: No content length specified for stream data.
Stream contents will be buffered in memory and could result in out of memory errors
が出てしまいます。
StackOverFlow に、こんなのがありますが。。
amazon web services - How to set InputStream content Length - Stack Overflow
でも、メモリ不足エラーを引き起こしかねません。
やっぱり一時的にどこかに File を作って書き込んでサイズを求めるしかないのか、
こんな例も見かけましたが、、、
AmazonS3 s3 = new AmazonS3Client(awsCredentials); File scratchFile = File.createTempFile("prefix", "suffix"); FileUtils.copyInputStreamToFile(inputStream, scratchFile); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, scratchFile); PutObjectResult putObjectResult = s3.putObject(putObjectRequest);
File.createTempFile で作られる一時ファイルって、
Windows だと、ユーザのディレクトリ
C:\Users\Xxxxxxxxx\AppData\Local\Temp
こんなところに、
prefix + xxxxxxxxxxxxxxx + suffix
という書式で一時ファイルができる。
ここに、 inputStream から copy して、これを、PutObjectRequest にして送る。
ということなのだが、、、
InputStream から送る場合のサイズ指定は、正確に指定するか、まったく指定しないで運に任せるのか
ということになってしまう。
そもそも長さ不明を送るなんて、、、とも思うが、どう解決するのが良いのか。。。