2015-08-28 5 views
13

Ich habe bereits eine Unterklasse von Request, die für HTTP-Post auf dem Server verwendet wird. Das Problem ist, ich habe keine Ahnung, wie ich einen Parameter für eine Datei hinzufügen kann. Das Veröffentlichen der Zeichenfolge auf dem Server ist einfach. aber ich muss Datei als einen anderen Parameter hinzufügen. Wie kann ich es tun?Wie hochzuladen Datei mit Volley-Bibliothek in Android?

public class AddNewPetRequest extends Request<JSONObject> { 

    private Response.Listener<JSONObject> listener; 

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

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

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

    @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) { 
     // TODO Auto-generated method stub 
     listener.onResponse(response); 
    } 
} 

UPDATE FRAGE: ich das Muster eines der Antworten hier in Stackoverflow folgen, und ich kam mit dieser Implementierung bis:

public class MultipartRequest extends Request<String> { 

private MultipartEntity entity = new MultipartEntity(); 

private final Response.Listener<String> mListener; 
private HashMap<String, String> mParams; 


public MultipartRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener) 
{ 
    super(Method.POST, url, errorListener); 
    mListener = listener; 

    buildMultipartEntity(); 
} 

private void buildMultipartEntity() 
{ 
    entity.addPart("profile_picture", new FileBody(new File("/storage/emulated/0/Pictures/VSCOCam/2015-07-31 11.55.14 1.jpg"))); 
    try 
    { 
     entity.addPart("user_id", new StringBody("15")); 
     entity.addPart("name", new StringBody("Bogs")); 
     entity.addPart("gender", new StringBody("Male")); 
     entity.addPart("date_birth", new StringBody("1999-12-5")); 
     entity.addPart("breed", new StringBody("monkey")); 
    } 
    catch (UnsupportedEncodingException e) 
    { 
     VolleyLog.e("UnsupportedEncodingException"); 
    } 
} 

@Override 
public String getBodyContentType() 
{ 
    return entity.getContentType().getValue(); 
} 

@Override 
public byte[] getBody() throws AuthFailureError 
{ 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try 
    { 
     entity.writeTo(bos); 
    } 
    catch (IOException e) 
    { 
     VolleyLog.e("IOException writing to ByteArrayOutputStream"); 
    } 
    return bos.toByteArray(); 
} 

@Override 
protected Response<String> parseNetworkResponse(NetworkResponse response) 
{ 
    return Response.success("Uploaded", getCacheEntry()); 
} 

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

} 

Als ich diese Anfrage an meine Anfrage-Warteschlange hinzufügen, Es antwortet ein com.android.volley.TimeoutError, aber wenn eine Überprüfung der Datenbank, die Anfrage ausgeführt und Elemente zur Tabelle hinzufügen, aber das Profilbild Upload hat nur 1 Byte Größe. ein anderes Problem, mein Datenbankelement wurde zweimal hinzugefügt.

PROBLEM gelöst Ich habe dies bereits behoben, indem ich seine Anfragezeit eingestellt habe. was passiert ist, ich nicht in der Lage bin, die Antwort von meinem Server zu erhalten, nachdem das Standard-Timeout von Volley Bibliothek so mein Timeout durch den Aufruf und diese Methode, um meine Anfrage Queue Einstellung:

multipartRequest.setRetryPolicy(new DefaultRetryPolicy(1000 * 60, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
       DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
+0

prüfen out: - http://stackoverflow.com/a/19981901/4018207 – AndiGeeky

+0

Sie können [meine Frage und Antwort hier] lesen (http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-htpentiity). Hoffe das hilft! – BNK

+0

@MamataGelanee Wie kann ich die MultipartEntity Klasse bekommen? Ich importiere dies durch meine Größe ** Kompiliergruppe: 'org.apache.httpcomponents', Name: 'httpclient-android' **, Version: '4.3.5.1' aber es scheint, dass MultipartEntity immer noch fehlt. –

Antwort

7

ich bemerkt haben, aber vielleicht Sie habe noch nicht gelesen. Also hier ist meine Antwort.

Wenn Sie Volley verwenden möchten, können Sie auf einige folgenden Links verweisen:

  1. Working POST Multipart Request with Volley and without HttpEntity
  2. How to send a “multipart/form-data” POST in Android with Volley
  3. Trouble Sending Multipart File with Boundary via Volley

this helps

+2

Ich weiß nicht warum, aber ich bekomme immer eine IOException schreiben ByteArrayOutputStream Fehler, während getBody heißt –

+0

Post mehr Code und vollständige logcat pls – BNK

+0

Muss ich meine getParams() überschreiben, wie ich in mein Beispiel oder sollte ich meinen Parameter zu MultipartEntityBuilder durch addTextBody() hinzufügen –