尝试使用Volley发送图像文件时出错?

时间:2014-11-25 12:45:33

标签: android android-volley

我有一张图片,我尝试使用Volley库发送到我的网络服务和其他params。问题是我不知道如何使用POST传递关于URL的图像。

寻找解决方案我已经建立了使用MultiPart的任何建议,而我正在尝试实施但仍然无法做到这一点。

我在我的应用程序中创建了其他构造函数,这个构造函数应该接收一个文件但是也不起作用,而HashMap也不接受文件参数

我该怎么做?

我正在尝试这个。

public class ApplicationController extends Request<JSONObject>{
        private Map<String, String> headers;    
        private Map<String, String> params;
        private Response.Listener<JSONObject> listener;
        private File imageFile;
        private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create();

        public ApplicationController(String url, Map<String, String> params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
            super(Method.GET, url, errorListener);
            this.listener = listener;
            this.params = params;
        }

        public ApplicationController(int method, String url, Map<String, String> params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
            super(method, url, errorListener);
            this.listener = listener;
            this.params = params;
        }

        /** construtor to send image */
        public ApplicationController(int method, 
                                     String url, 
                                     Map<String, String> params, 
                                     Response.Listener<JSONObject> listener, 
                                     Response.ErrorListener errorListener,
                                     File file) {
            super(method, url, errorListener);
            this.listener = listener;
            this.params = params;
            this.imageFile = file;
        }

        protected Map<String, String> getParams() throws AuthFailureError {
            return params;
        };


        public Map<String, String> getHeaders() throws AuthFailureError {
            headers = new HashMap<String, String>();
            String cred = String.format("%s:%s", BasicAuthenticationRest.USERNAME, BasicAuthenticationRest.PASSWORD);
            String auth = "Basic " + Base64.encodeToString(cred.getBytes(), Base64.DEFAULT);
            headers.put("Authorization", auth);

            return headers;
        };

        private void buildMultipartEntity(){
            mBuilder.addBinaryBody("", imageFile, ContentType.create("image/png"), imageFile.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<JSONObject> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
            }
        }


        @Override
        protected void deliverResponse(JSONObject response) {
            listener.onResponse(response);
        }

}

使用

/** add an user and upload your foto(image) */
public ApplicationController insert(Usuario u, File imageFile, final UsuarioAdapter listener){
    boolean insert = false; 

    HashMap<String, String> params = new HashMap<String, String>();
        params.put("nome", u.getNome());
        params.put("email", u.getEmail());
        params.put("senha", u.getSenha());      
        params.put("tipo", "usuarios");
        params.put("acao", "add");
        params.put("device_tipo", "android");
        params.put("device", AndroidReturnId.getAndroidId());
        params.put("uploadedfile", imageFile);      

    ApplicationController apc = new ApplicationController(Method.POST, urlPost.toString(), params,  
        new Response.Listener<JSONObject>() { 
            @Override 
            public void onResponse(JSONObject obj) {
                try {
                    if(obj.getString("cod").equals("999")){                                                                             
                        listener.usuarioIsAdded(true);
                    }else{
                        listener.usuarioIsAdded(false);                                                     
                    }
                } catch (JSONException e) {                                                                     
                    e.printStackTrace();
                }
            }           
        }, 
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError arg0) {
                Log.e("ERROR METHOD:", "insert in UsuarioDAO: " + arg0.getLocalizedMessage());
            }                                                                         
        }, File file);

    return apc;
}

1 个答案:

答案 0 :(得分:0)

将文件编码为基本64位编码的字符串并在正文中设置(只需确保您的服务器接受此格式!)。 Google如何在java中实现这一点,无处不在

params.put("uploadedfile", base64EncodedImageFile);