2014-11-25 2 views
1

У меня есть изображение, которое я пытаюсь отправить на мой веб-сервис с другими параметрами, используя библиотеку Volley. Проблема в том, что я не знаю, как передать это изображение по URL-адресу, используя POST.Ошибка при попытке отправить файл изображения с помощью Volley?

Ищете решение Я основал любые предложения по использованию 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; 
} 

ответ

0

закодировать файл с базой 64 закодированной строки и установить, что в теле (только убедитесь, что ваш сервер принимает этот формат!). Google, как это сделать в java, это везде

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

Вы говорите, что хотите преобразовать файл в Base64 string? – FernandoPaiva

+0

Да. Существует довольно много существующих учебников о том, как сделать это онлайн – MobileMon

+0

и ApplicationController. Я могу постоянно передавать файл или передавать String? – FernandoPaiva

Смежные вопросы