Android Multipart Upload

Как часть моего приложения для Android, я хотел бы загрузить растровые изображения, которые будут храниться удаленно. У меня есть простая связь HTTP GET и POST, прекрасно работающая, но документация о том, как делать многостраничный POST, кажется такой же редкой, как единороги.

Кроме того, я хочу передать изображение непосредственно из памяти вместо работы с файлом. В приведенном ниже примере кода я получаю байтовый массив из файла, который будет использоваться позже с HttpClient и MultipartEntity.

    File input = new File("climb.jpg");
    byte[] data = new byte[(int)input.length()];
    FileInputStream fis = new FileInputStream(input);
    fis.read(data);

    ByteArrayPartSource baps = new ByteArrayPartSource(input.getName(), data);

Все это кажется мне совершенно понятным, за исключением того, что я не могу для жизни меня узнать, где взять этот ByteArrayPartSource. Я связан с файлами httpclient и httpmime JAR, но не с кубиками. Я слышал, что структура пакета резко изменилась между HttpClient 3.x и 4.x.

Кто-нибудь использует этот ByteArrayPartSource в Android, и как они его импортировали?

После того, как вы собрались в документации и очистили Интернет, я придумал то, что соответствовало моим потребностям. Чтобы сделать множественный запрос, такой как форма POST, следующий код сделал для меня трюк:

    File input = new File("climb.jpg");

    DefaultHttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("http://localhost:3000/routes");
    MultipartEntity multi = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    String line;

    multi.addPart("name", new StringBody("test"));
    multi.addPart("grade", new StringBody("test"));
    multi.addPart("quality", new StringBody("test"));
    multi.addPart("latitude", new StringBody("40.74"));
    multi.addPart("longitude", new StringBody("40.74"));
    multi.addPart("photo", new FileBody(input));
    post.setEntity(multi);

    HttpResponse resp = client.execute(post);

бит HTTPMultipartMode.BROWSER_COMPATIBLE очень важен. Благодаря блог Radomir на этом.

Ответ 1

попробуйте следующее:

 HttpClient httpClient = new DefaultHttpClient() ;

 HttpPost httpPost = new HttpPost("http://example.com");
 MultipartEntity entity = new MultipartEntity();     
 entity.addPart("file", new FileBody(file));
 httpPost.setEntity(entity );
 HttpResponse response = null;

 try {
     response = httpClient.execute(httpPost);
 } catch (ClientProtocolException e) {
     Log.e("ClientProtocolException : "+e, e.getMessage());         
 } catch (IOException e) {
     Log.e("IOException : "+e, e.getMessage());

 } 

Ответ 2

Возможно, вы можете сделать следующий шаг для импорта библиотеки на ваш Android.

библиотека требований - apache-mime4j-0.6.jar - httpmime-4.0.1.jar

  • Щелкните правой кнопкой мыши свой проект и выберите свойства
  • выберите путь сборки java
  • выберите вкладку "Заказ и экспорт"
  • Применить его
  • Полностью удалите файл apk с удалением adb из-за существующего apk не для новой библиотеки.
  • снова установите ваш apk
  • запустите его

Спасибо,

Jenz

Ответ 3

У меня такая же проблема. Я пытаюсь загрузить изображение через MultiPart Entity, и он видит, что несколько обновлений на HttpClient/MIME взламывают все. Я пытаюсь использовать следующий код, падая с ошибкой " NoClassDefFoundError":

public static void executeMultipartPost(File image, ArrayList<Cookie> cookies, String myUrlToPost) {
    try {
        // my post instance
        HttpPost httppost = new HttpPost(myUrlToPost);
        // setting cookies for the connection session
        if (cookies != null && cookies.size() > 0) {
            String cookieString = "";
            for (int i=0; i<cookies.size(); ++i) {
                cookieString += cookies.get(i).getName()+"="+cookies.get(i).getValue()+";";
            }
            cookieString += "domain=" + BaseUrl + "; " + "path=/";
            httppost.addHeader("Cookie", cookieString);
        }
        // creating the http client
        HttpClient httpclient = new DefaultHttpClient();
        // creating the multientity part [ERROR OCCURS IN THIS BELLOW LINE]
        MultipartEntity multipartEntity = new MultipartEntity();
        multipartEntity.addPart("photoupload", new FileBody(image));
        httppost.setEntity(multipartEntity);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity resEntity = response.getEntity();
    } catch (Exception e) {}
}

Этот метод полностью компилируется и использует httpclient-4.0.1.jar и httpmime -4.2.jar, но опять же, я помню, что он провалился в комментариях для меня.