Android 截击失败的多部分表单数据请求
我正在尝试向服务器发送多部分数据,这些数据还包括一些图像。 因此,我以这种方式扩展了Android 截击失败的多部分表单数据请求,android,android-volley,multipartform-data,Android,Android Volley,Multipartform Data,我正在尝试向服务器发送多部分数据,这些数据还包括一些图像。 因此,我以这种方式扩展了请求: public class MultipartImageRequest extends Request<String> { private MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create(); private static final String STRING_PART_NAME = "text";
请求
:
public class MultipartImageRequest extends Request<String> {
private MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
private static final String STRING_PART_NAME = "text";
private final Response.Listener<String> mListener;
private final ArrayList<Bitmap> mFiles = new ArrayList<>();
private HashMap<String, String> mParams = new HashMap<>();
public MultipartImageRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener, ArrayList<Bitmap> files, HashMap<String, String> params)
{
super(Method.POST, url, errorListener);
mListener = listener;
mFiles.addAll(files);
mParams = params;
}
private void buildMultipartEntity()
{
int i = 0;
for(Bitmap image : mFiles) {
/*Compress bitmap*/
ByteArrayOutputStream bos = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 50, bos);
entityBuilder.addPart("image_" + i, new ByteArrayBody(bos.toByteArray(), "image_" + i));
i++;
}
StringBuilder paramsBuilder = new StringBuilder();
Iterator<Map.Entry<String, String>> paramIterator = mParams.entrySet().iterator();
while (paramIterator.hasNext()) {
Map.Entry<String,String> entry = paramIterator.next();
entityBuilder.addPart(entry.getKey(), new StringBody(entry.getValue(), ContentType.DEFAULT_TEXT));
}
}
@Override
public String getBodyContentType()
{
return "multipart/form-data; charset=utf-8";
}
@Override
public byte[] getBody() throws AuthFailureError
{
buildMultipartEntity();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
entityBuilder.build().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
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","multipart/form-data; charset=utf-8");
return params;
}
@Override
protected void deliverResponse(String response)
{
mListener.onResponse(response);
}
}
public类MultipartImageRequest扩展请求{
私有MultipartEntityBuilder entityBuilder=MultipartEntityBuilder.create();
私有静态最终字符串字符串\u PART\u NAME=“text”;
私人最终回应。监听器;
私有最终ArrayList mFiles=新ArrayList();
私有HashMap mParams=新HashMap();
公共多部分图像请求(字符串url、Response.ErrorListener ErrorListener、Response.Listener、ArrayList文件、HashMap参数)
{
super(Method.POST、url、errorListener);
mListener=监听器;
mFiles.addAll(文件);
mParams=参数;
}
私有void buildMultipartEntity()
{
int i=0;
用于(位图图像:mFiles){
/*压缩位图*/
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
image.compress(位图.CompressFormat.JPEG,50,bos);
entityBuilder.addPart(“图像”+i,新的ByteArrayBody(bos.toByteArray(),“图像”+i));
i++;
}
StringBuilder paramsBuilder=新StringBuilder();
迭代器paramIterator=mParams.entrySet().Iterator();
while(parameterator.hasNext()){
Map.Entry=parameterator.next();
entityBuilder.addPart(entry.getKey()、新StringBody(entry.getValue()、ContentType.DEFAULT_TEXT));
}
}
@凌驾
公共字符串getBodyContentType()
{
返回“多部分/表单数据;字符集=utf-8”;
}
@凌驾
公共字节[]getBody()抛出AuthFailureError
{
buildMultipartEntity();
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
尝试
{
entityBuilder.build().writeTo(bos);
}
捕获(IOE异常)
{
e(“向ByteArrayOutputStream写入IOException”);
}
返回bos.toByteArray();
}
@凌驾
受保护的响应parseNetworkResponse(NetworkResponse响应)
{
返回Response.success(“上传”,getCacheEntry());
}
@凌驾
公共映射getHeaders()引发AuthFailureError{
Map params=新的HashMap();
参数put(“内容类型”,“多部分/表单数据;字符集=utf-8”);
返回参数;
}
@凌驾
受保护的void deliverResponse(字符串响应)
{
mListener.onResponse(response);
}
}
问题是,如果我将内容类型设置为application/json
,它会工作并向服务器发送数据,但服务器显然会返回一个错误400
,因为它需要一个多部分请求,而不是将内容类型设置为multipart/form data;charset=utf-8
就像上面的代码Volley
一样,只是没有发送请求并给我一个错误500
。
我用它来检查我的数据,它证实了我上面所说的。
另外,我正在使用Rest客户端,请求也在使用它和iphone。我自己找到了解决方案,向请求传递边界很重要,否则服务器将无法获取我们的参数。 可以通过替换此代码来完成此操作:
public MultipartImageRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener, ArrayList<Bitmap> files, HashMap<String, String> params)
{
super(Method.POST, url, errorListener);
mListener = listener;
mFiles.addAll(files);
mParams = params;
}
@Amitkumarkanaujiya你可以设置任何你想要的,你的边界可以是“blabla”只是一个任意名称服务器人员需要知道边界吗?不,不需要,因为你在标题中指定了它。你能检查一下这个问题吗?你的情况是相同的还是你有什么想法?@amitkumarkanaujiya我错了还是你刚刚链接了这个讨论?
public MultipartImageRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener, ArrayList<Bitmap> files, HashMap<String, String> params)
{
super(Method.POST, url, errorListener);
mListener = listener;
mFiles.addAll(files);
mParams = params;
entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
entityBuilder.setBoundary(BOUNDARY);
}
@Override
public String getBodyContentType()
{
return "multipart/form-data; boundary=" + BOUNDARY + "; charset=utf-8";
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String,String> params = new HashMap<String, String>();
params.put("Content-Type","multipart/form-data; boundary=" + BOUNDARY + "; charset=utf-8");
return params;
}