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以内でないと送信できないのが課題としてあります。