Android - 使用volley库将json对象中的图像发布到服务器

时间:2015-11-26 14:29:21

标签: java android json multipartentity

我希望将json对象包含的图像发送到我的服务器使用Volley Library它将空字段发布到服务器,图像文件成功发布

我应该在这个合成中发布Json

{ "user_id":"value" , "post_title":"value","Specialty":"value","post_detail":"value", "uploaded_file","file" }

这是我的安卓代码

import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.HttpHeaderParser;
import com.imaadv.leaynik.Util.AppConstants;

import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.StringBody;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by NT on 10/26/15.
 */
public class PhotoMultipartRequest<T> extends Request<T> {


    private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create();
    private Response.Listener<T> mListener;
    private File mImageFile;
    protected Map<String, String> headers;
    private JSONObject params;
    private String file_name;
    private boolean hasFile;

    public PhotoMultipartRequest(JSONObject params, String url, Response.ErrorListener errorListener, Response.Listener<T> listener, String file_name, File imageFile, boolean hasFile) {
        super(Method.POST, url, errorListener);
        mListener = listener;
        mImageFile = imageFile;
        this.params = params;
        this.file_name = file_name;
        this.hasFile = hasFile;
        BuildMultiPartEntity();

    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = super.getHeaders();
        if (headers == null || headers.equals(Collections.emptyMap())) {
            headers = new HashMap<>();
        }
        headers.put("accept", "application/json");
        headers.put("Content-type","application/json");

        return headers;
    }

    private void BuildMultiPartEntity() {

//        Set keys = params.keySet();
//        for (Iterator i = keys.iterator(); i.hasNext(); ) {
//            String key = (String) i.next();
//            try {
//
//            }catch (Exception e){
//                e.printStackTrace();
//            }
//
//        }


        StringBody userId = new StringBody(params.get(AppConstants.USER_ID) ,ContentType.APPLICATION_JSON);
        StringBody postDetail = new StringBody(params.get(AppConstants.POST_DETAIL) ,ContentType.APPLICATION_JSON);
        StringBody postTitle = new StringBody(params.get(AppConstants.POST_TITLE) ,ContentType.APPLICATION_JSON);
        StringBody Speciality = new StringBody(params.get(AppConstants.SPECIALTY) ,ContentType.APPLICATION_JSON);

        mBuilder.addPart(AppConstants.USER_ID ,userId );
        mBuilder.addPart(AppConstants.POST_DETAIL ,postDetail );
        mBuilder.addPart(AppConstants.POST_TITLE ,postTitle );
        mBuilder.addPart(AppConstants.SPECIALTY ,Speciality );

        mBuilder.addTextBody(AppConstants.DATA, params.toString());

        if (hasFile) {
            mBuilder.addBinaryBody(file_name, mImageFile, ContentType.create("image/jpeg"), mImageFile.getName());
        }

        mBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        mBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));
    }

    @Override
    public String getBodyContentType() {
        String contentTypeHeader = mBuilder.build().getContentType().getValue();
        return contentTypeHeader;
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            mBuilder.build().writeTo(bos);
        } catch (IOException e) {
            VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request.");
        }

        return bos.toByteArray();
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        T result = null;
        return Response.success(result, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    protected void deliverResponse(T response) {
        mListener.onResponse(response);
    }

    @Override
    protected VolleyError parseNetworkError(VolleyError volleyError) {
        Log.i("Error1", volleyError.getMessage());
        return super.parseNetworkError(volleyError);
    }

    @Override
    public void deliverError(VolleyError error) {
        Log.i("Error2", error.getMessage());
        super.deliverError(error);
    }
}

任何人都可以指导我的代码中出现了什么问题