2012-05-06 4 views
2

HTTP File Uploadの間に私のjProgressBarの値を更新したいと思います。HTTPアップロードを使用するJava ProgressBarは更新されません

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);は正しいです: ここに私のコードは、私は、Javaに新たなんだと私は正しいことをやっているかわかりませんか?

答えて

3

I SwingWorkerを使用しての第二@Marko Topolnicの提案、ハウツーにさらにあなたを取得するために、これらの便利なリンクを見てください、

  1. How to Use Progress Bars
  2. Concurrency in Swing
  3. Worker Threads and SwingWorker
@trashgodによって

およびexample

+0

ありがとう、@マルコトポルニック!あなたの例は非常に便利で、私は独立した労働者に私の機能を入れ、それはうまくいった! – user1376701

6

30個の質問ごとに1つのように、javaというタグが付いているのは、あなたと同じ解決策です。イベントハンドラの内部ですべての作業をしています。つまり、イベントディスパッチスレッドで発生していることを意味します。 SwingWorkerを使用して作業を委任する必要があります。

+0

回答ありがとうございますが、どうすれば作業者からのアップロードの進捗状況を取得できますか? – user1376701

+0

何を試しましたか?コンパイルに失敗したコードがあるか、実行時に 'jProgressBar1'への参照を他のスレッドに共有する際に問題がありますか? –

関連する問題