QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

HTTPを使用してのファイル送信

現在、HTTPにてPOSTで、CSVファイルを送信する処理を実装中です。

今回、相手側の指定により、Content-Typeをmultipart/form-dataではなく、application/x-www-form-urlencodedで送信する必要があります。

multipart/form-dataでファイル送信を行った経験はあるのですが、今回のようなケースは初めてでして、試行錯誤しております。

1.以下のような実装を行ったのですが、
  これは間違いではないでしょうか?
  処理に問題がある、このような方法は本来間違えている
  などご指摘頂ければ助かります。

2.その他ライブラリや、サンプルページ等ご存知でしたら、教えてください。

よろしくお願いいたします。

/**
 * メイン
 * @param args 0:URL,1:送信CSVパス
 */
public static void main(String[] args) {

    System.out.println("url:" + args[0]);
    System.out.println("csvパス:" + args[1]);
    String urlStr = args[0];

    HttpClient client = new HttpClient();

    PostMethod method = new PostMethod(urlStr);

    // ----------------------------------------------------
    // 要求パラメータを設定
    // ----------------------------------------------------
    File file = new File(args[1]);
    BufferedInputStream in = null;
    StringWriter out = null;
    String csvDataStr = "";
    try {
        in = new BufferedInputStream(new FileInputStream(file));
        out = new StringWriter();
        int buff = 0;
        while((buff = in.read()) != -1){
            out.write(buff);
        }
        out.flush();
        csvDataStr = out.toString();
    } catch (FileNotFoundException e1) {
        // TODO 自動生成された catch ブロック
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO 自動生成された catch ブロック
        e1.printStackTrace();
    } finally {
        try {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }
    method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; ");
    method.setParameter("CSV", csvDataStr);

    // ----------------------------------------------------
    // 送信
    // ----------------------------------------------------
    String responseBody = null;
    try {
        int statusCode = client.executeMethod(method);

        if (statusCode != HttpStatus.SC_OK) {
            System.out.println("HTTP応答不良[" + statusCode + "]");
        }
        responseBody = method.getResponseBodyAsString();
    } catch (ConnectTimeoutException e) {
        //タイムアウトエラー
        System.out.println(e);

    } catch (IOException e) {
        //I/Oエラー
        System.out.println(e);

    } finally {
        method.releaseConnection();
    }
}

質問者:あおむし

回答

URLエンコードが要りますね。使っている文字が英数字だけなら大丈夫かも知れませんが。

投稿者:mio

編集 履歴 (0)

ファイルの中身(テキスト)を丸ごとURLエンコードして、
POSTで送るというのはやったことが有ります。
単に都合で送受信方法を単純にしたいという都合からでしたが、
特に問題なくやりとりができるかと思います。

私のケースは、送り側がExcelでXMLHTTP、
受け側がPHPと、今回とは全然話が違いますが、
処理が割と単純で済むのでそういう方法にしました。

なんというか「間違いとは言い切れないでしょう。」ということです。
間違いかどうか答えを知っているのは相手でしょう?
ここで聞いても正しい答えなんてわかりませんよ。

投稿者:かつのり

編集 履歴 (0)

mio様
現在の仕様では、全角文字は不要ですので、
エンコードについては問題ないと考えております。
ご指摘ありがとうございます。

かつのり様
ご指摘ありがとうございます。
そうですね、仕様については相手に確認するべきですね。
ファイル内容を、リクエストパラメタに設定する際の実装方法。
リクエストパラメタにファイル内容を設定して送信するということが
一般的な手法なのか。
というところを不安・疑問に思いましたので、
書き込みさせて頂きました。説明がいきとどかなくて申し訳ありません。

送受信方法を単純にするという目的で、このような方式でやりとりする
ことがあるんですね。確かに、処理は単純で済みますね。
すっきりしました。ありがとうございます。

投稿者:あおむし

編集 履歴 (0)

あおむしさんの書き込み (2009-04-03 11:42) より:

mio様

現在の仕様では、全角文字は不要ですので、

エンコードについては問題ないと考えております。

改行コードも入らないわけですか。

投稿者:mio

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。