TIL 2021-07-20


springbootバインドs 3でファイルを非同期でアップグレードしたいです!
まずpostmanを動機として確認し、
s 3をアップロードできるかどうかを非同期で検証してみました!
s 3にアップロードし、dbにも保存しますが、?🙄

WARNログ、
あ、アップロードするファイルの長さを決めてアップロードさせていただきます.
そうしないとout of memory errorが発生し、😨

既存

@Override
public String uploadFile(MultipartFile file) {
	String fileName = System.nanoTime()+StringUtils.cleanPath(file.getOriginalFilename());
	try {
		s3Client.putObject(
			new PutObjectRequest(
				bucket,
				fileName,
				file.getInputStream(),
				null)
			.withCannedAcl(
				CannedAccessControlList.PublicRead)
		);
	} catch (IOException e) {
		throw new FileUploadException(ExceptionEnum.FILEUPLOAD_EXCEPTION);
	}
	return s3Client.getUrl(bucket, fileName).toString();
	}

変更

@Override
public String uploadFile(MultipartFile file) {
	String fileName = System.nanoTime()+StringUtils.cleanPath(file.getOriginalFilename());
	try {
		InputStream is = file.getInputStream();
		Long contentLength = Long.valueOf(IOUtils.toByteArray(is).length);
		ObjectMetadata metaDate = new ObjectMetadata();
		metaDate.setContentLength(contentLength);
		s3Client.putObject(
			new PutObjectRequest(
				bucket,
				fileName,
				file.getInputStream(),
				metaDate)
			.withCannedAcl(
				CannedAccessControlList.PublicRead)
		);
	} catch (IOException e) {
		throw new FileUploadException(ExceptionEnum.FILEUPLOAD_EXCEPTION);
	}
	return s3Client.getUrl(bucket, fileName).toString();
}
  • InputStream
  • を初期化
  • IOUtils.TOByteArray法を用いてInputStreamのbyteを初期化する[]
  • Longタイプは
  • バイト[]です.valueOfメソッドをLongタイプ
  • に変換
  • オブジェクトメタデータオブジェクトを作成し、setContentLengthメソッドを使用して
  • を初期化します.
    新しく作成する
  • PutObjectRequestオブジェクトを、初期化NULL値のオブジェクトメタデータ期間
  • に入れる.
    このように修正してアップロードするのは不便です.
    ああ、まだ!非同期ajaxでfileを送信する場合は、multipart/form-data;charset=UTF-8を送信することを忘れないでください.😋