[英]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 = 40M
, post_max_size = 40M
, memory_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.