HTTPSページからHTTPサービスに直接アクセスできない場合、プロキシ層を追加する必要があります。この記事では、Javaを使用してHTTPSからHTTPへのファイル転送を実装する方法を紹介します。
必要な依存関係
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.3</version>
</dependency>
ファイルアップロードメソッドの実装
/**
* Apache HttpClientを使用したファイルアップロード
* @param targetUrl: 送信先のAPI URL
* @param uploadFile: アップロードするファイル
* @param paramName: API側で期待されるファイルパラメータ名 (@RequestParam("paramName")に相当)
* @param requestHeaders: リクエストヘッダ情報 (トークンなど、Content-Typeは設定しないでください)
* @param additionalParams: その他のフォームパラメータ
* @return: APIからのレスポンス文字列
*/
public static String sendFileViaProxy(String targetUrl, MultipartFile uploadFile,
String paramName, Map<String, String> requestHeaders,
Map<String, String> additionalParams) {
CloseableHttpClient httpClient = HttpClients.createDefault();
String responseResult = "";
try {
String originalFileName = uploadFile.getOriginalFilename();
HttpPost httpPostRequest = new HttpPost(targetUrl);
// ヘッダーの追加
requestHeaders.forEach((key, value) -> {
httpPostRequest.addHeader(key, value);
});
// マルチパートエンティティの構築
MultipartEntityBuilder multipartBuilder = MultipartEntityBuilder.create();
multipartBuilder.setCharset(Charset.forName("utf-8"));
multipartBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); // 日本語文字化け防止
// ファイルの追加
multipartBuilder.addBinaryBody(paramName, uploadFile.getInputStream(),
ContentType.MULTIPART_FORM_DATA, originalFileName);
// その他パラメータの追加
additionalParams.forEach((key, value) -> {
multipartBuilder.addTextBody(key, value);
});
HttpEntity requestEntity = multipartBuilder.build();
httpPostRequest.setEntity(requestEntity);
// リクエストの実行
HttpResponse serverResponse = httpClient.execute(httpPostRequest);
HttpEntity responseEntity = serverResponse.getEntity();
if (responseEntity != null) {
// レスポンスの文字列化
responseResult = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return responseResult;
}
この実装により、HTTPS環境から安全にHTTPサービスにファイルをアップロードできます。Javaのバックエンドが仲介役となり、ブラウザとHTTPサービス間の通信を中継します。
JavaScriptでHTTPSページから直接HTTPにファイルアップロードする方法をご存知の方がいらっしゃいましたら、ぜひ情報共有いただけますと幸いです。