0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Apex で multipart/form-data で binary file upload する

Last updated at Posted at 2022-12-15

Apex で multipart/form-data で binary file upload することがありましたので実装方法を記述してみます。
この例では、pdfファイルをpostすることにしています。

	/**
	 * multipart の header で指定するバウンダリー文字列
	 */
	@testVisible
	private static final String BOUNDARY_STR = 'hogehoge' + String.valueOf(DateTime.now().getTime());

	/**
	 * multipart の body 部で使用するバウンダリー文字列
	 */
	@testVisible
	private static final String BOUNDARY_BODY = '--' + BOUNDARY_STR;

	/**
	 * HTTP multipart リクエスト作成
	 * @param paths アクセス先パス
	 * @param fileBody ファイルデータバイナリー
	 * @return APIのリクエストとレスポンス結果
	 */
	@testVisible
	public static HttpResponse sendHttpMultiPart(String paths, Blob fileBody){
		HttpRequest httpReq = new HttpRequest();

		httpReq.setHeader('Content-Type', 'multipart/form-data; charset="UTF-8"; boundary=' + BOUNDARY_STR);

		String header = BOUNDARY_BODY + '\r\n';
			header += 'Content-Disposition: form-data; name="name"\r\n\r\n';
			header += 'file_name' + '\r\n';
			header += BOUNDARY_BODY + '\r\n';
			header += 'Content-Disposition: form-data; name="uploadfile"; filename="file_name"\r\n';
			header += 'Content-Type: application/pdf' ;
        
        Blob requestBody = getMultiPartBody(header, BOUNDARY_BODY, fileBody);
		httpReq.setBodyAsBlob(requestBody);

		httpReq.setEndpoint(paths);
		httpReq.setMethod('POST');

		HttpResponse httpRes = new Http().send(httpReq);
        return httpRes;

	}

	/**
	 * multipart/form-data を作成する
	 * @param header ヘッダー
	 * @param boundary バウンダリー
	 * @param file_body 添付ファイル
	 */
	public static Blob getMultiPartBody(String header, String boundary, Blob fileBody){
		Blob headerBlob = Blob.valueOf(header + '\r\n\r\n');
		Blob footerBlob = Blob.valueOf('\r\n' + boundary + '--');

		Blob bodyBlob = combineBlob(new List<Blob>{headerBlob, fileBody, footerBlob});

		System.debug('Request Header and Footer : \r\n' + headerBlob.toString() + footerBlob.toString());

		return bodyBlob;
	}

	/**
	 * Blob を結合する
	 * @param blobs 結合したいblob
	 * @return 結合したblob
	 */
	public static Blob combineBlob(List<Blob> blobs){
		String encodedHex = '';
		if(blobs == null){
			return Blob.valueOf(encodedHex);
		}
		for(Blob target : blobs){
			encodedHex += EncodingUtil.convertToHex(target);
		}
		return EncodingUtil.convertFromHex(encodedHex);
	}
	

肝心な箇所は combineBlob() です。ここでmultipart/form-dataの文字列である header と、バイナリであるファイルデータを結合しています。

課題

6MB以上のファイルでは FATAL_ERROR System.StringException: String length exceeds maximum: 12000000 が発生するため、ファイルが5MB以内でないと送信できないのが課題としてあります。

0
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?