У меня есть веб-сервис, который загружает файл. (подробности в первой ссылке)
Для связи с этим веб-сервисом я использую org.apache.http
библиотека (Apache HttpComponents). Я нашел большую часть этого кода, если не весь Вот.
К сожалению, решение работает только с изображениями, и, несмотря на усилия при загрузке видео, показывает ошибку 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-8Closable 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 этот но все равно показывает ту же ошибку
Обновить
Вот как я обрабатываю multipart (я использую multipartform)
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
но это может быть иначе.
Загрузить
Я пробовал с 9s Video размером ~ 350Kb, но все равно выдает ошибку длины контента, что означает, что может быть набор контента по умолчанию или его нет вообще
Так что я не знаю, что я сделал / изменил, но теперь он работает с ошибкой.
Я действительно хотел бы знать, почему это вызывает ошибку, которая пока не имеет смысла, если только она не вызывает что-то, что не может принимать слишком большое значение (метод типа 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();
}
Веб-сервис такой же, как и в первой ссылке.
Ниже приведен мой код (не обращайте внимания на комментарии, которые я не очистил, дряхлый / измененный / замененный / тестовый / другие подходы)
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, не знал, будет ли он рассматривать только работающую версию или считал все (не тестировал)) и изменил значения как Лукас Холт (он исправил это, т. е. я просто предоставляю информацию о том, кому нужно или, возможно, объяснение) сказал, и он заслуживает похвалы за это. (Я уверен, что раньше это не сработало, я просто много тестировал и не помню на самом деле.)
Других решений пока нет …