Android Multipart HTTP Post не отправляет тип файла MIME

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

Мне удалось получить коды для загрузки файла на веб-службу 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;
}

Спасибо большое:)

Ответ 1

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

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

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

MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

к

MultipartEntity mp = new MultipartEntity();

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

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

Ответ 2

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

Решение, требующее минимального изменения для меня, заключается в явном определении filename при построении a 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 части, которая будет отформатирована, проверяется, если не null в режиме BROWSER_COMPATIBLE. Если значение null, то все тело игнорируется.

Ответ 3

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

К сожалению, использование "нормального" MultipartEntity() для нас не является опцией, так как этот бэкэнд рельсов испортил обработку запроса.

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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

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