Android Multipart Upload - PullRequest
       13

Android Multipart Upload

10 голосов
/ 13 октября 2010

Как часть моего приложения для 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. Я связался с файлами JAR httpclient и httpmime, но не играл в кости. Я слышал, что структура пакета резко изменилась между 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. Спасибо Блогу Радомира за это.

Ответы [ 3 ]

2 голосов
/ 04 ноября 2010

попробуйте это:

 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());

 } 
1 голос
/ 26 сентября 2012

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

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

  1. Rightщелкните ваш проект и выберите свойства
  2. выберите путь сборки java
  3. выберите вкладку под названием "Заказ и экспорт"
  4. Примените ее
  5. Полностью удалите файл apk с помощьюADB удалить из-за существующего apk не обслуживает новую библиотеку
  6. установить снова ваш apk
  7. запустить его

Спасибо,

Jenz

0 голосов
/ 05 июня 2012

У меня такая же проблема. Я пытаюсь загрузить изображение через 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 , но, опять же, я помню, что в комментируемой строке происходит сбой для меня.

...