2010-12-22 36 views
1

我想上傳使用Java URL類的文件,並且我發現堆棧溢出中的previous question這很好地解釋了細節,所以我試着按照它進行操作。以下是我的代碼,採用answer中給出的sniplet。使用Java URL類將數據寫入服務器是否需要服務器響應?

我的問題是,如果我不作出的connection.getResponseCode()一個或connection.getInputStream()connection.getResponseMessage()或任何其從服務器到REPONSE相關的呼叫,請求將永遠不會被髮送到服務器。爲什麼我需要這樣做?或者有什麼方法可以在沒有得到響應的情況下寫入數據?

P.S.我開發了一個服務器端上傳servlet,它接受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(); 
    } 
} 

回答

1

HttpURLConnection類包含了許多影響的要求制定者,所以它需要當你完成建設的要求知道,以便它可以把它關閉。這樣做的方式是等待直到你真正要求從請求返回的東西,比如InputStream。 (這可以說是一個設計缺陷。)這也是爲什麼設置者拋出IllegalStateException「如果已經連接」的原因 - 一旦你調用getter,連接就建立了,並且調用setter已經太遲了。

你應該能夠打電話getInputStream(),然後只是close()它沒有實際閱讀它。

0

只需調用getResponseCode()。這將啓動轉移。無論如何你必須這樣做,以確保請求成功,或找出失敗的原因。

0

對於那些誰正在檢查這個片段中,有一條線,我認爲是錯誤的:

OutputStream output = output = connection.getOutputStream(); 

檢查出來;)
順便說一句,這是真的,你必須使用getResponseCode()方法一試在連接時處理異常,這樣做很好,確保連接正常工作。

+1

謝謝你挑選那個。我已糾正它。但是,編譯失敗並沒有錯。它只是重複。 – gigadot 2012-02-08 22:11:04

相關問題