1

私はJavaURLクラスを使用してファイルをアップロードしようとしていますが、スタックオーバーフローに関する以前の質問を見つけました。これは詳細について非常によく説明しているので、それに従うようにしています。そして、以下は答えで与えられたスニプレットから採用された私のコードです。

私の問題connection.getResponseCode()は、サーバーからの応答に関連する、またはconnection.getInputStream()または何かに電話をかけないとconnection.getResponseMessage()、リクエストがサーバーに送信されないことです。なぜこれを行う必要があるのですか?または、応答を取得せずにデータを書き込む方法はありますか?

PS私は、を使用してそれを受け入れmultipart/form-dataてファイルに保存するサーバー側のアップロードサーブレットを開発しましたFileUpload。それは安定していて問題なく確実に機能しているので、これは私の問題が発生する場所ではありません。

import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.commons.io.IOUtils;

public class URLUploader {

    public static void closeQuietly(Closeable... objs) {
        for (Closeable closeable : objs) {
            IOUtils.closeQuietly(closeable);
        }
    }

    public static void main(String[] args) throws IOException {
        File textFile = new File("D:\\file.zip");
        String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.

        HttpURLConnection connection = (HttpURLConnection) new URL("http://localhost:8080/upslet/upload").openConnection();
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        OutputStream output = connection.getOutputStream();

        PrintWriter writer = new PrintWriter(output, true);
        // Send text file.
        writer.println("--" + boundary);
        writer.println("Content-Disposition: form-data; name=\"file1\"; filename=\"" + textFile.getName() + "\"");
        writer.println("Content-Type: application/octet-stream");
        FileInputStream fin = new FileInputStream(textFile);
        writer.println();
        IOUtils.copy(fin, output);
        writer.println();
        // End of multipart/form-data.
        writer.println("--" + boundary + "--");
        output.flush();
        closeQuietly(fin, writer, output);
        // Above request will never be sent if .getInputStream() or .getResponseCode() or .getResponseMessage() does not get called.
        connection.getResponseCode();
    }
}
4

3 に答える 3

1

HttpURLConnectionには、リクエストに影響を与える一連のセッターがあるため、リクエストを送信できるように、リクエストの作成が完了したことを知る必要があります。これを行う方法は、InputStreamなど、リクエストから実際に何かを要求するまで待つことです。(これはおそらく設計上の欠陥です。)これが、セッターが「すでに接続されている場合」にIllegalStateExceptionをスローする理由でもあります。ゲッターを呼び出すと接続が確立され、セッターを呼び出すには遅すぎます。

あなたは実際にそれから読むことなくgetInputStream()それからそれだけを呼び出すことができるはずです。close()

于 2010-12-22T01:48:39.190 に答える
0

getResponseCode()を呼び出すだけです。これで転送が開始されます。とにかくリクエストが成功したことを確認するか、リクエストが失敗した理由を見つけるためにそれを行う必要があります。

于 2010-12-22T23:13:19.560 に答える
0

このスニペットをチェックしている人のために、私が間違っていると思う行があります:

OutputStream output = output = connection.getOutputStream();


ちなみに、接続を確立するときに例外を処理するためにメソッドを使用する必要があるのは事実です。これは、getResponseCode()接続が正しく機能していることを確認するのに役立ちます。

于 2012-02-08T16:01:02.013 に答える