开发者

Android Multipart HTTP Post does not send the File's MIME type

Trying to figure what's wrong with my codings. I followed a blog post from here.

I managed to get the codes to actually upload the file to a PHP web service. However, for some reason although I've set explicitly the MIME type for the file, PHP shows that the MIME is just a blank string and therefore rejected.

Here's my codings:

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开发者_StackOverflow);
    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;
}

Many thanks before :)


I had the same problem and just fixed it.

I found that using the HttpMultipartMode.BROWSER_COMPATIBLE prevented the correct mimeType from being set in my request, when using a ByteArrayBody for an image. I assume this is probably the same problem you are having.

When I changed this line:

MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

to

MultipartEntity mp = new MultipartEntity();

then the mime type was set correctly and the service upload worked.

I see that people used the BROWSER_COMPATIBLE for solving another problem, but hopefully you don't need it.


I just had the same issue when updating HttpClient from version 4.1 to version 4.4. Neither removing HttpMultipartMode.BROWSER_COMPATIBLE nor replacing with other alternative options did help.

A solution that requires the minimum change for me is to explicitly specify the filename when constructing a FileBody, i.e. replacing

new FileBody(file, mimeType)

with

new FileBody(file, filename, mimeType, charset)

As for version HttpClient 4.4, the reason might be that new FileBody(file, mimeType) assigns null to the filename field rather than uses file.getName(). Then, when executing formatMultipartHeader in HttpMultipart, the filename of the part that is going to be formatted is checked if not null in BROWSER_COMPATIBLE mode. If null, then the whole body is ignored.


I had the same problem for awhile for posting 3 FileBodies and 1 mime info, the mime (in json) was never received unless I sent only one filebody. I always addpart the filebody first which caused me the problem. I reversed the order by addpart the mime at very beginning and every info including mime are received correctly at php server end.


Instead of including the jars files you can use the http multipart classes defined in android but declared as internal, so you cannot use them directly, you have to download them from the android source code and add them to your project. Some basics modifications must be performed before using them, nothing difficult (change the packages name, remove all logger calls). It works perfectly for me.I hope this could help somebody,


So while all the above answers did help in getting it right.

But just removing the HttpMultipartMode.BROWSER_COMPATIBLE wouldn't solve it.

You can set the mime type by doing this

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

N.B. I am using the latest repackaged android client http://code.google.com/p/httpclientandroidlib/ which supports multipart uploads, etc.


We have the same issue here. Using HttpMultipartMode.BROWSER_COMPATIBLE removed the correct mimetype being sent.

Unfortunately using the 'normal' MultipartEntity() is not an option for us, as this way the rails backend messes up the request handling.

Is there any way to set the content-type of the multipart yourself and use HttpMultipartMode.BROWSER_COMPATIBLE??

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜