0

私はサイトのアップローダ クラスを作成しています。その中で、ファイルをアップロードした後、そのサイトからのアップロード応答を読んでいます。応答を読まなかった場合、ファイルはアップロードされていません。私のコードは次のとおりです。

   String charset = "UTF-8";


        File binaryFile = new File("C:\\TestVideoFile.flv");
        String boundary = Long.toHexString(System.currentTimeMillis());
        System.out.println(boundary);// Just generate some unique random value.
        String CRLF = "\r\n"; // Line separator required by multipart/form-data.
        URLConnection connection = new URL(UPLOAD_URL).openConnection();
        connection.setDoInput(true); 
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
        PrintWriter writer = null;
        try {
            OutputStream output = connection.getOutputStream();
            writer = new PrintWriter(new OutputStreamWriter(output, charset), true); // true = autoFlush, important!
            writer.append("--" + boundary).append(CRLF);
            writer.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + binaryFile.getName() + "\"").append(CRLF);
            writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF);
            writer.append("Content-Transfer-Encoding: binary").append(CRLF);
            writer.append(CRLF).flush();
            InputStream input = null;
            try {
                input = new FileInputStream(binaryFile);
                long filelen = binaryFile.length();
                System.out.println("Length : " + filelen);
                int dataRead = 0;
                byte[] buffer = new byte[1024];
                for (int length = 0; (length = input.read(buffer)) > 0;) {

                    output.write(buffer, 0, length);
                }
                System.out.println("Now only terminating the file write loop");
                output.flush(); // Important! Output cannot be closed. Close of writer will close output as well.
            } catch (Exception e) {
                System.out.println(e);
            } finally {
                if (input != null) {
                    try {
                        input.close();
                    } catch (IOException logOrIgnore) {
                        System.out.println(logOrIgnore);
                    }
                }
            }
            writer.append(CRLF).flush(); // CRLF is important! It indicates end of binary boundary.

            // End of multipart/form-data.
            writer.append("--" + boundary + "--").append(CRLF);

            System.out.println("Sending username");
            // Send normal param.
            writer.append("--" + boundary).append(CRLF);
            writer.append("Content-Disposition: form-data; name=\"user\"").append(CRLF);
            writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
            writer.append(CRLF);
            writer.append(username).append(CRLF).flush();
            System.out.println("Sending password");
            writer.append("--" + boundary).append(CRLF);
            writer.append("Content-Disposition: form-data; name=\"password\"").append(CRLF);
            writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
            writer.append(CRLF);
            writer.append(password).append(CRLF).flush();


            System.out.println("Reading response from server");

            BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String k = "", tmp = "";
            while ((tmp = br.readLine()) != null) {
                System.out.println(tmp);
                k += tmp;
            }
            if (k.contains("Successfully")) {
                System.out.println("File Uploaded successfully into PutLocker :)");
                String downloadLink = parseResponse(k, "<link>", "</link>");
                System.out.println("Download Link : " + downloadLink);
            } else {
                System.out.println("Upload failed :(");
            }

          } catch (Exception e) {
            System.out.println(e);
        } finally {
            if (writer != null) {
                writer.close();
            }
        }

ご覧のとおり、次の行でサーバーにデータを書き込んでいます。

for (int length = 0; (length = input.read(buffer)) > 0;) {

                        output.write(buffer, 0, length);
                    }

しかし、この後、私は次のことをしなければなりません、

 BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String k = "", tmp = "";
                while ((tmp = br.readLine()) != null) {
                    System.out.println(tmp);
                    k += tmp;
                }

アップロードを成功させるためにサーバーからの応答を読み取る必要があるのはなぜですか?

誰でもこれについて説明できますか?

前もって感謝します。

4

1 に答える 1

2

サーバーに何かを投稿しようとして、メッセージを完全に送信する前に接続が中断された場合、サーバーは不完全な要求の処理を停止します。サーバーがリクエストの受信を完了し、その応答を待機しないと、リクエストが正常に送信されたかどうかはわかりません。したがって、URLConnection は、応答を受け取るまで待機するように設計されています。

もう 1 つの理由は、最初に URLConnection を構築して構成し、後で必要に応じてgetInputStreamまたはを呼び出して送信する場合があることですgetResponseCode。トランザクションを実行するタイミングをより詳細に制御できます。

常に呼び出す必要はありません。要求を完了するにはgetInputStream、呼び出すだけでgetResponseCode十分です。ただし、入力ストリーム全体は引き続きコードに送信されますが、破棄されます。

于 2012-09-24T05:31:14.920 に答える