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

问题描述:

我有一张图像,我正在尝试使用Volley库将图像发送给我的web服务和其他参数。问题是我不知道如何使用POST传递这个关于URL的图像。尝试使用Volley发送图像文件时出错?

寻找解决方案我已经建立了使用MultiPart的任何建议,我试图实现,但仍然无法完成这项工作。

我在应用程序中创建其他的构造,该构造应该收到文件,但不也是工作而HashMap不接受文件PARAM

我怎样才能做到这一点?

我正在试着这个。

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

编码文件到基64编码字符串,并设置在机身(只要确保你的服务器接受这种格式!)。谷歌如何在java中做到这一点,它无处不在

params.put("uploadedfile", base64EncodedImageFile);  
+0

你说要将文件转换为Base64字符串? – FernandoPaiva 2014-11-25 15:11:11

+0

是的。有关于如何在线 – MobileMon 2014-11-25 15:15:53

+0

和ApplicationController我可以连续传递文件或应传递字符串的现有教程不少? – FernandoPaiva 2014-11-25 15:19:56