5

コードのサンプルをテストしていますが、常にエラーが発生しますconnection.setDoInput(true);

HttpsURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inputStream = null;

String urlServer = "https://www.myurl.com/upload.php";
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";

int bytesRead = 0;
int bytesAvailable = 0;
int bufferSize = 0;
byte[] buffer = null;
int maxBufferSize = 1*1024*1024;

try {
    FileInputStream fileInputStream = new FileInputStream(new File(params[0]));

    URL url = new URL(urlServer);

    connection = (HttpsURLConnection) url.openConnection();
    connection.setConnectTimeout(1000);

    // Allow Inputs & Outputs
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);

    // Enable POST method
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

    connection.setConnectTimeout(1000);

    outputStream = new DataOutputStream(connection.getOutputStream());
    outputStream.writeBytes(twoHyphens + boundary + lineEnd);
    outputStream.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + params[0] + "\"" + lineEnd);
    outputStream.writeBytes(lineEnd);

    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    buffer = new byte[bufferSize];

    // Read file
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    while (bytesRead > 0) {
        outputStream.write(buffer, 0, bufferSize);
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    }

    outputStream.writeBytes(lineEnd);
    outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

エラーログはjava.lang.IllegalStateException: Already connected. 私はこれらを試しましたが、どれも機能していません:

connection.setRequestProperty("Connection", "close");
connection.disconnect();
connection.setConnectTimeout(1000);

編集:私が電話しなかったときでもconnection.connect()、同じエラーが発生しますalready connected

4

4 に答える 4

1
  1. ストリームの最後まで読み取った後、入力ストリームを閉じる必要があります。

  2. への呼び出しを削除する必要がありますconnect()。間違った場所にありますが、自動で呼び出される必要はまったくありません。

  3. POST を設定する行を削除することもできます。これは、 を呼び出す際に暗黙的に行われsetDoOutput(true)ます。

  4. また、コピー ループでそのクラッドのほとんどを削除することもできます。固定サイズのバッファーを使用します。

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    

    読み取りごとに新しいバッファーを使用しないでください。電話しないでくださいavailable()。GO を渡さないでください。200ドルを集めないでください。

于 2016-07-05T01:57:57.350 に答える
0

ここに http 接続に関する非常に良い投稿があります

要点は、POST の場合、次のものだけが必要であるということです。

HttpURLConnection connection = (HttpURLConnection) new URL(urlToRead).openConnection();
// setDoOutput(true) implicitly set's the request type to POST
connection.setDoOutput(true);

HttpsURLConnection を指定する必要があるかどうかもわかりません。HttpURLConnection を使用して、Https サイトに接続できます。バックグラウンドで Java に作業を任せてください。

json の投稿に使用する POST コードは次のとおりです。

public static String doPostSync(final String urlToRead, final String content) throws IOException {
    final String charset = "UTF-8";
    // Create the connection
    HttpURLConnection connection = (HttpURLConnection) new URL(urlToRead).openConnection();
    // setDoOutput(true) implicitly set's the request type to POST
    connection.setDoOutput(true);
    connection.setRequestProperty("Accept-Charset", charset);
    connection.setRequestProperty("Content-type", "application/json");

    // Write to the connection
    OutputStream output = connection.getOutputStream();
    output.write(content.getBytes(charset));
    output.close();

    // Check the error stream first, if this is null then there have been no issues with the request
    InputStream inputStream = connection.getErrorStream();
    if (inputStream == null)
        inputStream = connection.getInputStream();

    // Read everything from our stream
    BufferedReader responseReader = new BufferedReader(new InputStreamReader(inputStream, charset));

    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = responseReader.readLine()) != null) {
        response.append(inputLine);
    }
    responseReader.close();

    return response.toString();
}
于 2014-12-02T11:19:00.210 に答える
-1

追加

if (connection != null) connection.disconnect();

connection = (HttpsURLConnection) url.openConnection();

問題が解決したかどうかを確認します。はいの場合connection.disconnect()、元のコードで呼び出されていないことを意味します。connection.disconnect()ブロックの最後に置くかもしれませんがtry、その前に例外が発生するため、catch ブロックにジャンプしてconnection.disconnect()呼び出されません。

于 2016-12-04T04:31:19.280 に答える