2016-03-04 1 views
0

Je fais une application et je dois télécharger une image en utilisant Volley. J'ai essayé de google, mais je n'ai pas trouvé quelque chose de similaire. Comment faire un téléchargement en plusieurs parties d'une image et ajouter des paramètres comme user_id lors de la publication de cette image en utilisant Volley? Utiliser Retrofit n'est pas une option dans mon cas.Android volley télécharger l'image

+0

Oui à l'aide de volley: Essayez cette http://stackoverflow.com/a/29430765/5275436 –

Répondre

0

Tout d'abord créer un fichier MultipartRequest comme suit:

public class MultipartRequest extends Request<String> { 
private MultipartEntityBuilder entity = MultipartEntityBuilder.create(); 
private final Response.Listener<String> mListener; 
private final File file; 
private final HashMap<String, String> params; 

public MultipartRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener, File file, HashMap<String, String> params) 
{ 
    super(Method.POST, url, errorListener); 

    mListener = listener; 
    this.file = file; 
    this.params = params; 
    buildMultipartEntity(); 
    buildMultipartEntity2(); 

} 



private void buildMultipartEntity() 
{ 
    entity.addBinaryBody(KEY_IMAGE, file, ContentType.create("image/jpeg"), file.getName()); 
    entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
    entity.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8")); 

    try 
    { 
     for (String key : params.keySet()) { 
      entity.addPart(key, new StringBody(params.get(key))); 
     } 
    } 
    catch (UnsupportedEncodingException e) 
    { 
     VolleyLog.e("UnsupportedEncodingException"); 
    } 
} 

@Override 
public String getBodyContentType() 
{ 
    return entity.build().getContentType().getValue(); 
} 
@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    Map<String, String> headers = super.getHeaders(); 

    if (headers == null 
      || headers.equals(Collections.emptyMap())) { 
     headers = new HashMap<String, String>(); 
    } 

    headers.put("Accept", "application/json"); 

    return headers; 
} 

@Override 
public byte[] getBody() throws AuthFailureError 
{ 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try 
    { 
     entity.build().writeTo(bos); 
    } 
    catch (IOException e) 
    { 
     VolleyLog.e("IOException writing to ByteArrayOutputStream"); 
    } 
    return bos.toByteArray(); 
} 
/** 
* copied from Android StringRequest class 
*/ 
@Override 
protected Response<String> parseNetworkResponse(NetworkResponse response) { 
    String parsed; 
    try { 
     parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
    } catch (UnsupportedEncodingException e) { 
     parsed = new String(response.data); 
    } 
    return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response)); 
} 

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

Dans votre activité tout simplement faire une demande Multipart comme suit:

public void uploadImage() 
{ 
    try { 
     pDialog = new ProgressDialog(getActivity()); 
     pDialog.setMessage("Loading..."); 
     pDialog.show(); 

      HashMap params = new HashMap<String, String>(); 

      params.put(KEY_NAME, name); 
     MultipartRequest sr = new MultipartRequest(UPLOAD_URL, new Response.Listener<String>() { 

      @Override 
      public void onResponse(String response) { 
       if ((pDialog != null) && pDialog.isShowing()) { 
        pDialog.dismiss(); 
       } 
       Log.d("file", f + ""); 
       Log.d("", ".......response====" + response.toString()); 

       //////// 
       try { 
        JSONObject object = new JSONObject(response); 
        String serverCode = object.getString("code"); 
        if (serverCode.equalsIgnoreCase("0")) { 

        } 
        if (serverCode.equalsIgnoreCase("1")) { 
         try { 

          if ("1".equals(serverCode)) { 
           JSONObject object1 = object.getJSONObject("data"); 

          } 
         } 
0

En utilisant Retrofit 2:

Vous devez utiliser La classe RequestBody d'OkHttp et encapsule votre fichier dans un corps de requête (signifie votre ID utilisateur).
1) créer une interface

public interface FileUploadService { 
    @Multipart 
    @POST("/upload") 
    Call<String> upload(
      @Part("myfile\"; filename=\"image.png\" ") RequestBody file, 
      @Part("userid") RequestBody userid); 
} 

2) Code d'activité:

FileUploadService service = 
      ServiceGenerator.createService(FileUploadService.class); 

    String userid = "your_userid"; 
    RequestBody data = 
      RequestBody.create(MediaType.parse("multipart/form-data"), userid); 

    File file = new File("path/to/your/file"); 
    RequestBody requestBody = 
      RequestBody.create(MediaType.parse("multipart/form-data"), file); 

    Call<String> call = service.upload(requestBody, data); 
    call.enqueue(new Callback<String>() { 
     @Override 
     public void onResponse(Call<String> call, Response<String> response) { 
      Log.v("Upload", "success"); 
     } 

     @Override 
     public void onFailure(Call<String> call, Throwable t) { 
      Log.e("Upload", t.getMessage()); 
     } 
    });  

Référez-lien: https://futurestud.io/blog/retrofit-2-how-to-upload-files-to-server