簡體   English   中英

如何通過Java Http Post發送和接受文件?

[英]how to send and accept file over Java Http Post?

我只想通過網絡發送文本文件和JPEG文件。 幸運的是,我可以訪問服務器代碼和客戶端代碼。 這是我的(谷歌應用引擎)代碼。

private void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
    GcsFilename filename = new GcsFilename("my-bucket", "my-file");
    Builder fileOptionsBuilder = new GcsFileOptions.Builder();
    fileOptionsBuilder.mimeType("text/html");
    GcsFileOptions fileOptions = fileOptionsBuilder.build();
    GcsOutputChannel outputChannel = gcsService.createOrReplace(filename, fileOptions);

    byte[] buffer = new byte[1024];
    InputStream reader = req.getInputStream();
    BufferedOutputStream outStream = new BufferedOutputStream(Channels.newOutputStream(outputChannel));
    while(true) {
        int bytesRead = reader.read(buffer);
        if (bytesRead == -1) {
            break; // have a break up with the loop.
        } else if (bytesRead < 1024) {
            byte[] temp = Arrays.copyOf(buffer, bytesRead);
            outStream.write(temp);
        } else {
            outStream.write(buffer);
        }
    }

    outStream.close();
    outputChannel.close();
}

如您所見,我使用原始InputStream來獲取通過網絡發送的所有數據。

在客戶端,我像這樣發送文本文件:(在Android中)

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpost = new HttpPost("http://my-hosted-url/postit");
MultipartEntity entity = new entity.addPart("myImageFile", new FileBody(someLogFile));
httpost.setEntity(entity);
HttpResponse response;
response = httpClient.execute(httpost);

這工作得很好...有點。 問題是,當我嘗試查看發送的文件/數據時,它上面有一個標頭,例如:

--NNqarc4FsG0G8hUzd82A6TCjgzKH Content-Disposition: form-data; name="myString" Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit STRING_VALUE ---NNqarc4FsG0G8hUzd82A6TCjgzKH Content-Disposition: form-data; name="myImageFile"; filename="something.txt" Content-Type: application/octet-stream Content-Transfer-Encoding: binary

[Thu Aug 14 17:14:26 PDT 2014] then the real log starts here...

我如何擺脫以某種方式卡在身體上的標頭?

您在這里有一個多部分的請求。 這是單個請求,其中主體由用分隔符字符串分隔的各個部分組成。

就您而言,它更易於查看為:

--NNqarc4FsG0G8hUzd82A6TCjgzKH 
Content-Disposition: form-data; name="myString" 
Content-Type: text/plain; charset=US-ASCII 
Content-Transfer-Encoding: 8bit 

STRING_VALUE 
---NNqarc4FsG0G8hUzd82A6TCjgzKH 
Content-Disposition: form-data; name="myImageFile"; filename="something.txt" 
Content-Type: application/octet-stream 
Content-Transfer-Encoding: binary

[binary here]

它有兩個部分,每個部分都有對應的標題和正文。 我猜你對屍體感興趣。 您需要提取它們。

您可以閱讀HTTP規范和/或有關多部分請求的規范並編寫自己的解析器,也可以使用一些內置方法(我不知道GAE是否已准備好Servlet 3.0)或第三者方法。 看這些

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM