Javaプロキシ経由でのファイルアップロード実装

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にファイルアップロードする方法をご存知の方がいらっしゃいましたら、ぜひ情報共有いただけますと幸いです。

タグ: Java Apache HttpClient ファイルアップロード HTTPS HTTP

7月11日 22:24 投稿