Загрузка файла HTTP без фактического использования файла - PullRequest
3 голосов
/ 28 февраля 2012

Я использую Apache HttpComponents 'HttpClient для загрузки файлов в сторонний веб-интерфейс. Код выглядит так:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("UPLOAD_URL");
FileBody bin = new FileBody(file, filename, "text/csv", "UTF-8");
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("Username", new StringBody("User"));
reqEntity.addPart("Password", new StringBody("Password"));
reqEntity.addPart("bin", bin);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);

Это работает, как ожидалось.

Поскольку эти данные являются конфиденциальными, я не хочу, чтобы они хранились на стороне клиента. (Программа извлекает эти данные из веб-службы. Я создал файл только для его загрузки.)

Так что я ищу способ не использовать настоящий файл, а заменить его на какое-то представление в памяти. Я попытался использовать InputStreamBody вместо этого, но эти запросы отклоняются сторонней системой.

Есть идеи, как это можно сделать?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Похоже, проблема с использованием InputStreamBody заключается в методе getContentLength, который выглядит следующим образом:

public long getContentLength() {
    return -1;
}

В результате получается chunked HTTP POST (Transfer-Encoding: chunked), который, кажется, не понимается этим конкретным веб-интерфейсом.Итак, я закончил расширять InputStreamBody так:

public class NoFileBody extends InputStreamBody {

  private final long length;

  public NoFileBody(final InputStream in, final String mimeType, final String filename, final long length) {
    super(in, mimeType, filename);
    this.length = length;
  }

  @Override
  public long getContentLength() {
    return length;
  }

}
0 голосов
/ 28 февраля 2012

Взгляните на MultipartEntity: метод addPart принимает String и ContentBody в качестве параметров.Кажется, что ContentBody - это простой интерфейс для реализации (FileBody реализует его).В основном вам нужно написать метод writeTo (OutputStream) для вывода ваших данных в OutputStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...