Android Multipart HTTP Post不发送文件';s MIME类型

Android Multipart HTTP Post不发送文件';s MIME类型,android,httpclient,http-post,mime-types,multipartform-data,Android,Httpclient,Http Post,Mime Types,Multipartform Data,试图找出我的密码有什么问题。我关注了一篇来自中国的博客文章 我成功地获得了将文件上传到PHPWeb服务的代码。然而,出于某种原因,尽管我已经明确设置了文件的MIME类型,但PHP显示MIME只是一个空白字符串,因此被拒绝 这是我的密码: public String SendPost(String fn, String bid, String caption, String uid, String APIKey, String postHash) throws ParseExce

试图找出我的密码有什么问题。我关注了一篇来自中国的博客文章

我成功地获得了将文件上传到PHPWeb服务的代码。然而,出于某种原因,尽管我已经明确设置了文件的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;
}

之前非常感谢:)

我也有同样的问题,刚刚解决了

我发现使用
HttpMultipartMode.BROWSER\u COMPATIBLE
时,当使用
ByteArrayBody
处理图像时,无法在我的请求中设置正确的mimeType。我想这可能和你遇到的问题是一样的

当我改变这一行时:

MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

然后,mime类型设置正确,服务上载工作正常


我看到人们使用与
浏览器兼容的
来解决另一个问题,但希望您不需要它。

我们这里也有同样的问题。使用
HttpMultipartMode.BROWSER\u COMPATIBLE
删除发送的正确mimetype

不幸的是,我们不能选择使用“普通”的MultipartEntity()
,因为这样rails后端会弄乱请求处理


有没有办法自己设置多部分的内容类型并使用
HttpMultipartMode.BROWSER\u COMPATIBLE

发布3个文件体和1个mime信息时遇到了同样的问题,除非我只发送了一个文件体,否则从未收到mime(json格式)。我总是先添加文件体的一部分,这导致了我的问题。我颠倒了顺序,在一开始就添加了mime,包括mime在内的所有信息都在php服务器端正确接收。

除了包含jars文件,您可以使用android中定义但声明为内部的http多部分类,因此您不能直接使用它们,您必须从下载并将其添加到项目中。在使用它们之前必须执行一些基本的修改,没有什么困难(更改软件包名称,删除所有日志记录程序
电话)。这对我来说非常有效。我希望这能帮助一些人,

因此,尽管上面所有的答案都有助于正确回答

但是仅仅删除
HttpMultipartMode.BROWSER\u COMPATIBLE
并不能解决这个问题

您可以通过执行以下操作来设置mime类型

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

N.B.我正在使用最新重新打包的android客户端,它支持多部分上传等。

我刚刚在将HttpClient从4.1版更新到4.4版时遇到了同样的问题。既不删除
HttpMultipartMode.BROWSER\u兼容
用其他替代方案替代也没有帮助

对我来说,需要最小更改的解决方案是在构造
文件体时显式指定
文件名
,即替换

new FileBody(file, mimeType)


至于版本HttpClient 4.4,原因可能是
新的文件体(file,mimeType)
null
分配给
文件名
字段,而不是使用
file.getName()
。然后,在
HttpMultipart
中执行
formatMultipartHeader
时,如果在
BROWSER\u COMPATIBLE
模式下不为空,则检查要格式化的部分的
文件名
。如果为空,则忽略整个身体。

这对我很有帮助。谢谢!嗨,你能告诉我什么是“字符集”吗?我给它设置了什么
new FileBody(file, mimeType)
new FileBody(file, filename, mimeType, charset)