有没有人能够完成发送 multipart/form-data
使用 Volley 在 Android 中发布 POST 了吗?我尝试上传 image/png
没有成功对我们的服务器使用 POST 请求,我很好奇是否有人有。
我相信执行此操作的默认方法是覆盖 public byte[] getPostBody()
在 Request.java
上课并附上File
那里有一个空白的标题键作为边界。但是,将我的文件转换为 String
对于Map<String, String> postParams
然后再次对其进行编码似乎很迟钝,而且不是很优雅。我的尝试也没有成功。这确实是我们切换到这个库的唯一障碍。
无论如何,所有的想法和答案都非常感谢。谢谢您的帮助。
最佳答案
我可能错了,但我认为您需要为此实现自己的 com.android.volley.toolbox.HttpStack
因为默认的 (HurlStack
if version > Gingerbread 或 HttpClientStack
) 不处理 multipart/form-data
。
编辑:
确实我错了。我能够在 Request 中使用 MultipartEntity
来做到这一点,如下所示:
public class MultipartRequest extends Request<String> {
private MultipartEntity entity = new MultipartEntity();
private static final String FILE_PART_NAME = "file";
private static final String STRING_PART_NAME = "text";
private final Response.Listener<String> mListener;
private final File mFilePart;
private final String mStringPart;
public MultipartRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener, File file, String stringPart)
{
super(Method.POST, url, errorListener);
mListener = listener;
mFilePart = file;
mStringPart = stringPart;
buildMultipartEntity();
}
private void buildMultipartEntity()
{
entity.addPart(FILE_PART_NAME, new FileBody(mFilePart));
try
{
entity.addPart(STRING_PART_NAME, new StringBody(mStringPart));
}
catch (UnsupportedEncodingException e)
{
VolleyLog.e("UnsupportedEncodingException");
}
}
@Override
public String getBodyContentType()
{
return entity.getContentType().getValue();
}
@Override
public byte[] getBody() throws AuthFailureError
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
entity.writeTo(bos);
}
catch (IOException e)
{
VolleyLog.e("IOException writing to ByteArrayOutputStream");
}
return bos.toByteArray();
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response)
{
return Response.success("Uploaded", getCacheEntry());
}
@Override
protected void deliverResponse(String response)
{
mListener.onResponse(response);
}
}
它很原始,但我用一张图片和一个简单的字符串尝试了它,它可以工作。响应是一个占位符,在这种情况下返回响应字符串没有多大意义。我在使用 apache httpmime 来使用 MultipartEntity 时遇到问题,所以我使用了 https://code.google.com/p/httpclientandroidlib/不知道有没有更好的办法。 希望对您有所帮助。
编辑
你可以不使用httpclientandroidlib而使用httpmime,唯一的依赖是httpcore。
关于android - 如何使用 Volley 在 Android 中发送 “multipart/form-data” POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16797468/