Проблема загрузки файла библиотеки Java Apache http

У меня есть веб-сервис, который загружает файл. (подробности в первой ссылке)

Для связи с этим веб-сервисом я использую 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, но все равно выдает ошибку длины контента, что означает, что может быть набор контента по умолчанию или его нет вообще

0

Решение

Так что я не знаю, что я сделал / изменил, но теперь он работает с ошибкой.

Я действительно хотел бы знать, почему это вызывает ошибку, которая пока не имеет смысла, если только она не вызывает что-то, что не может принимать слишком большое значение (метод типа 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, не знал, будет ли он рассматривать только работающую версию или считал все (не тестировал)) и изменил значения как Лукас Холт (он исправил это, т. е. я просто предоставляю информацию о том, кому нужно или, возможно, объяснение) сказал, и он заслуживает похвалы за это. (Я уверен, что раньше это не сработало, я просто много тестировал и не помню на самом деле.)

0

Другие решения

Других решений пока нет …