2

jProgressBarの間にその値を更新したいHTTP File Upload。私はJavaを初めて使用しますが、正しいことを行っているかどうかはわかりません。コードは次のとおりです。

private static final String Boundary = "--7d021a37605f0";

public void upload(URL url, File f) throws Exception
{
    HttpURLConnection theUrlConnection = (HttpURLConnection) url.openConnection();
    theUrlConnection.setDoOutput(true);
    theUrlConnection.setDoInput(true);
    theUrlConnection.setUseCaches(false);
    theUrlConnection.setChunkedStreamingMode(1024);

    theUrlConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary="
            + Boundary);

    DataOutputStream httpOut = new DataOutputStream(theUrlConnection.getOutputStream());


        String str = "--" + Boundary + "\r\n"
                   + "Content-Disposition: form-data;name=\"file1\"; filename=\"" + f.getName() + "\"\r\n"
                   + "Content-Type: image/png\r\n"
                   + "\r\n";

        httpOut.write(str.getBytes());

        FileInputStream uploadFileReader = new FileInputStream(f);
        int numBytesToRead = 1024;
        int availableBytesToRead;
        jProgressBar1.setMaximum(uploadFileReader.available());
        while ((availableBytesToRead = uploadFileReader.available()) > 0)
        {
            jProgressBar1.setValue(jProgressBar1.getMaximum() - availableBytesToRead);
            byte[] bufferBytesRead;
            bufferBytesRead = availableBytesToRead >= numBytesToRead ? new byte[numBytesToRead]
                    : new byte[availableBytesToRead];
            uploadFileReader.read(bufferBytesRead);
            httpOut.write(bufferBytesRead);
            httpOut.flush();
        }
        httpOut.write(("--" + Boundary + "--\r\n").getBytes());

    httpOut.flush();
    httpOut.close();

    // read & parse the response
    InputStream is = theUrlConnection.getInputStream();
    StringBuilder response = new StringBuilder();
    byte[] respBuffer = new byte[4096];
    while (is.read(respBuffer) >= 0)
    {
        response.append(new String(respBuffer).trim());
    }
    is.close();
    System.out.println(response.toString());
}

この行はjProgressBar1.setValue(jProgressBar1.getMaximum() - availableBytesToRead);正しいですか?

4

2 に答える 2

6

ここでタグ付けされた30の質問ごとに1つのようなものはjava、あなたと同じ解決策を持っています。すべての作業をイベントハンドラー内で実行しています。つまり、イベントディスパッチスレッドで実行されており、終了するまでGUIの更新をすべてブロックします。を使用してSwingWorker、作業をそれに委任する必要があります。

于 2012-05-06T13:51:24.617 に答える
3

私はSwingWorkerを使用するという@MarkoTopolnicの提案を2番目にして います。これらの便利なリンクを見て、Howtoについてさらに詳しく説明します。

  1. プログレスバーの使用方法
  2. Swingでの並行性
  3. ワーカースレッドとSwingWorker

@trashgodによる例

于 2012-05-06T14:11:34.057 に答える