簡體   English   中英

Java Apache http庫文件上傳問題

[英]Java Apache http library file upload issue

我有一個上傳文件的網絡服務。 (第一個鏈接中的詳細信息)

為了與此Web服務進行通信,我使用org.apache.http庫(Apache HttpComponents)。 我發現大多數代碼如果不是全部在這里

可悲的是,該解決方案僅適用於圖像,盡管嘗試上傳視頻時付出了很多努力,但仍顯示出Content Length too long的錯誤Content Length too long 為了解決此問題,我決定將其替換為當前使用的內容。 首先使用HttpClientBuilder

HttpClient httpclient = HttpClientBuilder.create().disableContentCompression().build();

我的嘗試失敗了,因為它仍然給出相同的錯誤,經過研究,我發現我需要按照以下方式使用CloseableHttpClient來禁用自動標頭

CloseableHttpClient httpclient = HttpClients.custom()
        .setHttpProcessor(HttpProcessorBuilder.create().build())
        .build();

那行得通,但是在設置標題時,沒有通過我無法弄清楚。 我做到了如下

httppost.addHeader("Keep-Alive", "timeout=5, max=100");
httppost.addHeader("Connection", "Keep-Alive");
httppost.addHeader("Content-Type", "text/html; charset=UTF-8");

但是當跟蹤響應時,這就是我所擁有的

Http Client Builder Trace
    Date,Tue, 28 Mar 2017 18:30:50 GMT
    Server,Apache/2.4.23 (Win64) PHP/7.0.10
    X-Powered-By,PHP/7.0.10
    Content-Length,43
    Keep-Alive,timeout=5, max=100
    Connection,Keep-Alive
    Content-Type,text/html; charset=UTF-8


Closable Response Trace
    Date,Tue, 28 Mar 2017 18:31:27 GMT
    Server,Apache/2.4.23 (Win64) PHP/7.0.10
    Content-Length,311
    Connection,close
    Content-Type,text/html; charset=iso-8859-1

我試圖將標題設置為響應,但是我還沒有弄清楚如何正確地實例化它來設置標題。 而且,我也試圖理解為什么未考慮httppost原因。 我錯過了什么?

我使用Closable時的最后一件事由於我猜不到標頭,因此我的方式不再上傳。

編輯

上載影片時發生錯誤

Exception in thread "main" org.apache.http.ContentTooLongException: Content length is too long: 16363535
at org.apache.http.entity.mime.MultipartFormEntity.getContent(MultipartFormEntity.java:103)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:199)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:306)
at testfileupload.PostFile.main(PostFile.java:100)
C:\Users\User\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

編輯

我改變了PHP的最大文件大小下面這個 ,但它仍然顯示了同樣的錯誤

更新

這就是我處理多部分(我使用多部分)的方式

HttpEntity resEntity = MultipartEntityBuilder.create()
    .addBinaryBody("userfile", file, ContentType.create("video/mp4"), file.getName())
    .build();

我記得閱讀有關它的內容(不確定),至於php.ini參數需要更高的值upload_max_filesize = 40Mpost_max_size = 40Mmemory_limit = 128M ,我確信它足夠(使用wamp64)。

自..以來,我一直試圖了解內容長度問題。

我發現HttpEntity集合會計算長度,並且我相信將它的2位值檢查掉了,但我相信,無論對接類型如何,它都不起作用並堅持內容長度錯誤。

我也試過

HttpClient httpclient = HttpClients.custom().setDefaultHeaders(Arrays.asList(CustomHeader)).build();

但是仍然沒有。 在這一點上,我高度懷疑它與設置標頭有關, HttpEntity與通過Multipart或HttpPost設置的HttpEntity有關,但可能還有其他問題。

上傳

我嘗試使用大小為〜350Kb的9s視頻,但它仍然顯示內容長度錯誤,這意味着可能存在默認內容集或根本沒有默認內容集

所以我不知道我做了什么/更改了,但是現在它可以處理錯誤了。

我真的很想知道為什么這會導致錯誤,到目前為止,除非調用了不能接受太高值的東西(param類型的方法所賦予的值比它多得多),否則它仍然沒有意義。

為了清楚起見,當我使用此錯誤時(驗證區域)

System.out.println(response.getStatusLine());
if (resEntity != null) {
// error from below, kinda forgot about it
      System.out.println(EntityUtils.toString(resEntity));
}

    if (resEntity != null) {
//      resEntity.consumeContent();
    }

該Web服務與第一個鏈接中的相同。

以下是我的代碼(不要介意我沒有清除陳舊,更改/替換/測試/其他方法的注釋)

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.ProtocolVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.CoreProtocolPNames;
import org.apache.http.protocol.HTTP;
import org.apache.http.protocol.HttpProcessorBuilder;
import org.apache.http.util.EntityUtils;


public class PostFile {
  public static void main(String[] args) throws Exception {
//    HttpClient httpclient = new DefaultHttpClient();

//    CloseableHttpClient httpclient = HttpClients.custom()
//        .setHttpProcessor(HttpProcessorBuilder.create().build())
//        .build();

//    Header headerCustom = new BasicHeader(HttpHeaders.CONTENT_LENGTH, "15");


//    HttpClient httpclient = HttpClients.custom().build();

//        HttpClient httpclient = HttpClientBuilder.create().disableContentCompression().build();
   HttpClient httpclient = HttpClientBuilder.create().build();     
//    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);


    HttpPost httppost = new HttpPost("http://localhost/userVids/upload.php");

    httppost.setProtocolVersion(new ProtocolVersion("HTTP", 1, 1));
    File file = new File("C:/Users/User/Desktop/test_video.mp4");

//    httppost.addHeader("Content-Length", String.valueOf(file.length()));

//    MultipartEntity mpEntity = new MultipartEntity();
//    ContentBody cbFile = new FileBody(file, ContentType.MULTIPART_FORM_DATA);
//    mpEntity.addPart("userfile", cbFile);
//      System.out.println(mpEntity.getContentLength());
//
//    httppost.setEntity(mpEntity);

    /*
        Date,Tue, 28 Mar 2017 18:30:50 GMT
        Server,Apache/2.4.23 (Win64) PHP/7.0.10
        X-Powered-By,PHP/7.0.10
        Content-Length,43
        Keep-Alive,timeout=5, max=100
        Connection,Keep-Alive
        Content-Type,text/html; charset=UTF-8
    */

    /*
        Date,Tue, 28 Mar 2017 18:31:27 GMT
        Server,Apache/2.4.23 (Win64) PHP/7.0.10
        Content-Length,311
        Connection,close
        Content-Type,text/html; charset=iso-8859-1
    */

    HttpEntity resEntity = MultipartEntityBuilder.create()
        .addBinaryBody("userfile", file, ContentType.create("video/mp4"), file.getName())
        .build();

      System.out.println("Entity Length " + resEntity.getContentLength());
//    httppost.addHeader("Keep-Alive", "timeout=5, max=100");
//    httppost.addHeader("Connection", "Keep-Alive");
//    httppost.addHeader("Content-Type", "text/html; charset=UTF-8");

//    httppost.addHeader("Content-Disposition", "form-data; name=\"userfile\"; filename=\"star_empty.png\"");
//    httppost.addHeader("Content-Type", "image/png");
//    httppost.addHeader("Content-Transfer-Encoding", "binary");
//    httppost.addHeader("Content-Length", "99999");

    httppost.setEntity(resEntity);

    System.out.println("executing request " + httppost.getRequestLine());
    HttpResponse response = httpclient.execute(httppost);
//    HttpEntity resEntity = response.getEntity();

    System.out.println("Headers (name,value)");
    List<Header> httpHeaders = Arrays.asList(response.getAllHeaders());        
    httpHeaders.forEach((header) -> {
        System.out.println(header.getName() + "," + header.getValue());
    });

    System.out.println(response.getStatusLine());
    if (resEntity != null) {
      System.out.println(EntityUtils.toString(resEntity));
    }
    if (resEntity != null) {
//      resEntity.consumeContent();
    }

//    httpclient.getConnectionManager().shutdown();
  }
}

但是有一個巨大的通知,我有我的php.ini文件(在wamp中更改了所有文件,不知道它是只考慮正在運行的版本還是讀取了所有文件(未測試)),並將值更改為Lucas Holt (他將其修復了)即,我只是提供誰的需求或解釋),他值得為此而贊揚。 (我確信在我進行了很多測試並且真的不記得之前,它是行不通的。)

暫無
暫無

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

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