2016-10-03 2 views
0

Я пытаюсь создать приложение Java, чтобы выполнить следующее, которое работает в CURL на Windows.Java Загрузить файл по HTTP-запросу POST

curl -x XXX.XXX.XXX.XXX:8080 -X POST --data-binary "@C:\Users\XXXXX\Documents\batch2.txt" http://XXXXX.XXX.XXXXXX.XXX/XX/XXXXXXX/XX/XXXXXXX/XXXXXXX 

Я был в состоянии повторить вызов, принимая содержимое файла и размещение его прямо на URL в Java с помощью HttpURLConnection однако это не является жизнеспособным и предпочел бы использовать метод файла, как это может быть довольно большой.

Код я в настоящее время является:

import java.io.File; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpHost; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.config.RequestConfig; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.util.EntityUtils; 
import org.apache.http.entity.mime.HttpMultipartMode; 



public class PostFile { 
    public static void main(String[] args) throws Exception { 

    CloseableHttpClient httpclient = HttpClients.createDefault(); 
    HttpPost httppost = new HttpPost("http://XXXXX.XXX.XXXXXX.XXX/XX/XXXXXXX/XX/XXXXXXX/XXXXXXX"); 

    RequestConfig requestConfig = RequestConfig.copy(RequestConfig.DEFAULT) 
    .setProxy(new HttpHost("XXX.XXX.XXX.XXX", 8080)) 
    .build(); 
    httppost.setConfig(requestConfig); 

    httppost.addHeader("Content-Type","data/binary"); 

    File file = new File("C:/Users/XXXXXX/Documents/batch2.txt"); 

    MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
    builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
    builder.addBinaryBody("batch", file); 

    final HttpEntity entity = builder.build(); 

    httppost.setEntity(entity); 

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

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

    httpclient.close(); 
    } 
} 

Проблема, которую я имею, что она не обеспечивает такой же ответ, и кажется, что он не в состоянии POST файл.

+0

'--data-binary' означает' -X Post', так что вам не нужно дать '-X' вариант, и это также означает' Content-Type: применение/х-www- form-urlencoded' (см. [curl manpage] (https://curl.haxx.se/docs/manpage.html#-d)), но ваш Java-код отправляет 'Content-Type: data/binary', что вероятно, ваша проблема. Что касается «не предоставления одного и того же ответа» *, было бы проще помочь вам, если вы разделите два ответа с нами. – Andreas

+0

Успешный ответ = Пакетный-id-XXXXX Плохой отклик = Пакет пуст – Charabon

+0

Я имел в виду показать полный ответ, включая заголовки. Во всяком случае, я только заметил, что ваш Java-код также отправляет файл как * multi-part *. Кажется, у вас есть идея, что команда 'curl' - это« загрузка »файла. Это не. Он просто отправляет файл на сервер в виде содержимого POST, закодированного в форме, что означает, что файл должен следовать за этим форматом содержимого. Все, что вам нужно сделать в Java, - это установить правильный контент Content-Type и потоковое содержимое файла напрямую. – Andreas

ответ

0

Спасибо Andreas для намекая к типу контента,

я изменил это и изменилось с MULTIPART Entity к FileEntity и теперь работает отлично.

import java.io.File; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpHost; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.config.RequestConfig; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.util.EntityUtils; 
import org.apache.http.entity.mime.HttpMultipartMode; 



public class PostFile { 
    public static void main(String[] args) throws Exception { 

    CloseableHttpClient httpclient = HttpClients.createDefault(); 
    HttpPost httppost = new HttpPost("http://XXXXX.XXX.XXXXXX.XXX/XX/XXXXXXX/XX/XXXXXXX/XXXXXXX"); 

    RequestConfig requestConfig = RequestConfig.copy(RequestConfig.DEFAULT) 
    .setProxy(new HttpHost("XXX.XXX.XXX.XXX", 8080)) 
    .build(); 
    httppost.setConfig(requestConfig); 

    httppost.addHeader("content-type", "application/x-www-form-urlencoded;charset=utf-8"); 

    File file = new File("batch2.txt"); 

    FileEntity entity = new FileEntity(file); 

    httppost.setEntity(entity); 

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

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

    httpclient.close(); 
    } 
} 
Смежные вопросы