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;
}