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/, который поддерживает многостраничные загрузки и т.д.