Android Multipart HTTP Post не отправляет MIME-тип файла - PullRequest
10 голосов
/ 14 августа 2010

Пытаюсь понять, что не так с моими кодировками.Я проследил за публикацией в блоге здесь .

Мне удалось получить коды для фактической загрузки файла в веб-службу PHP.Однако по какой-то причине, хотя я явно установил тип MIME для файла, PHP показывает, что MIME - это просто пустая строка и поэтому отклоняется.

Вот мои кодировки:

public String SendPost(String fn, String bid, String caption, String uid, String APIKey, String postHash) 
        throws ParseException, ClientProtocolException, IOException {
    HttpClient httpclient = new DefaultHttpClient();
    httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    HttpPost httppost = new HttpPost(UrbURL);

    Log.i("POSTFN", fn);
    Log.i("POSTFN", bid);
    Log.i("POSTFN", caption);
    Log.i("POSTFN", uid);
    Log.i("POSTFN", APIKey);
    Log.i("POSTFN", postHash);

    String postAuth = uid + postHash;
    postAuth = md5(postAuth);
    postAuth = postAuth.substring(0, 16);
    //Log.i("POSTAUTH", postAuth);

    MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

    /*File tempImg = new File(fn);
    FileBody bin = new FileBody(tempImg, "image/jpg");*/
    mp.addPart("business_photo", new FileBody(new File(fn), "image/jpg"));

    //StringBody s = new StringBody(bid, "text/plain", Charset.forName( "UTF-8" ));
    mp.addPart("business_id", new StringBody(bid, "text/plain", Charset.forName( "UTF-8" )));

    //s = new StringBody(caption, "text/plain", Charset.forName( "UTF-8" ));
    mp.addPart("photo_caption", new StringBody(caption, "text/plain", Charset.forName( "UTF-8" )));

    //s = new StringBody(uid, "text/plain", Charset.forName( "UTF-8" ));
    mp.addPart("user_id", new StringBody(uid, "text/plain", Charset.forName( "UTF-8" )));

    //s = new StringBody(APIKey, "text/plain", Charset.forName( "UTF-8" ));
    mp.addPart("apikey", new StringBody(APIKey, "text/plain", Charset.forName( "UTF-8" )));

    //s = new StringBody(postAuth, "text/plain", Charset.forName( "UTF-8" ));
    mp.addPart("auth", new StringBody(postAuth, "text/plain", Charset.forName( "UTF-8" )));

    httppost.setEntity(mp);

    String response = EntityUtils.toString( httpclient.execute( httppost ).getEntity(), "UTF-8" );

    httpclient.getConnectionManager().shutdown();

    return response;
}

Большое спасибо раньше:)

Ответы [ 6 ]

5 голосов
/ 28 октября 2010

У меня была та же проблема, и я ее только что исправил.

Я обнаружил, что использование HttpMultipartMode.BROWSER_COMPATIBLE не позволяет установить правильный mimeType в моем запросе при использовании ByteArrayBody для изображения.Я предполагаю, что это, вероятно, та же проблема, что и у вас.

Когда я изменил эту строку:

MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

на

MultipartEntity mp = new MultipartEntity();

, тогда тип пантомимы был установлен правильнои загрузка службы сработала.

Я вижу, что люди использовали BROWSER_COMPATIBLE для решения другой проблемы, но, надеюсь, вам это не нужно.

2 голосов
/ 30 марта 2015

У меня просто была такая же проблема при обновлении HttpClient с версии 4.1 до версии 4.4. Ни удаление HttpMultipartMode.BROWSER_COMPATIBLE и замена на другие альтернативные варианты не помогла.

Решение, которое требует от меня минимальных изменений, заключается в явном указании filename при построении FileBody, то есть замене

new FileBody(file, mimeType)

с

new FileBody(file, filename, mimeType, charset)

Что касается версии HttpClient 4.4, причиной может быть то, что new FileBody(file, mimeType) присваивает null полю filename, а не использует file.getName(). Затем при выполнении formatMultipartHeader в HttpMultipart проверяется filename части, которая будет отформатирована, если она не равна нулю в режиме BROWSER_COMPATIBLE. Если ноль, то все тело игнорируется.

1 голос
/ 12 декабря 2012

Так что, хотя все вышеперечисленные ответы помогли сделать это правильно.

Но простое удаление HttpMultipartMode.BROWSER_COMPATIBLE не решит проблему.

Вы можете установить тип пантомимы, выполнив это

ByteArrayBody bab = new ByteArrayBody(params.getByteArray("data"), "image/jpeg" , "image.jpg");

Примечание. Я использую последнюю версию перепакованного Android-клиента http://code.google.com/p/httpclientandroidlib/, который поддерживает загрузку нескольких частей и т. Д.

1 голос
/ 22 ноября 2011

Вместо того, чтобы включать файлы jars, вы можете использовать составные классы http, определенные в android, но объявленные как внутренние, поэтому вы не можете использовать их напрямую, вы должны загрузить их из исходного кода android и добавить ихк вашему проекту.Некоторые базовые модификации должны быть выполнены перед их использованием, ничего сложного (изменить имя пакета, удалить все вызовы логгера).Это прекрасно работает для меня. Надеюсь, это кому-нибудь поможет,

1 голос
/ 08 сентября 2011

У меня была такая же проблема в течение некоторого времени для публикации 3 FileBbody и 1 mime info, mime (в json) никогда не получалось, если я не отправил только один filebody. Сначала я всегда добавляю filebody, что и вызывает проблему. Я перевернул порядок по addpart mime в самом начале, и каждая информация, включая mime, была правильно получена в конце php-сервера.

1 голос
/ 25 ноября 2010

У нас тут такая же проблема. Использование HttpMultipartMode.BROWSER_COMPATIBLE удаляет правильный отправляемый mimetype.

К сожалению, использование 'normal' MultipartEntity() для нас не вариант, так как бэкэнд рельсов портит обработку запросов.

Есть ли способ самостоятельно установить тип содержимого мультичасти и использовать HttpMultipartMode.BROWSER_COMPATIBLE ??

...