2013-08-17 13 views
29

Ich benutze Volley für den Aufruf von Web-Anfrage für meine App. Aber ich bin zum ersten Mal Volley. Ich möchte nur wissen, wie man Bild-/Videomediadaten per Volley mit Multipart hochladen kann.So multipart Daten mit Android Volley

ich es viele Websites gesucht, habe ich einige Ergebnisse über

How to send a “multipart/form-data” POST in Android with Volley

Aber does'nt sehen diese Methoden gut oder zienten. Also, bitte hilf mir, wie man Mediendaten mit Volley hochladen kann. Oder ich sollte Volley nicht verwenden, und sollte für den vorherigen manuellen Ansatz gehen

Wie auch immer, alle Gedanken und Antworten werden sehr geschätzt. Danke für Ihre Hilfe.

+0

Hochladen mit dem Fortschritt http://stackoverflow.com/a/28144660/185022 –

Antwort

28

Sie wissen nicht, wenn Sie eine Antwort erhalten haben, aber wenn Sie diese nicht haben, versuchen:

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.util.Map; 

import org.apache.http.HttpEntity; 
import org.apache.http.entity.mime.HttpMultipartMode; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 
import org.apache.http.entity.mime.content.FileBody; 

import com.android.volley.AuthFailureError; 
import com.android.volley.NetworkResponse; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyLog; 

public class MultipartRequest extends Request<String> { 

// private MultipartEntity entity = new MultipartEntity(); 

MultipartEntityBuilder entity = MultipartEntityBuilder.create(); 
HttpEntity httpentity; 
private static final String FILE_PART_NAME = "file"; 

private final Response.Listener<String> mListener; 
private final File mFilePart; 
private final Map<String, String> mStringPart; 

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

    mListener = listener; 
    mFilePart = file; 
    this.mStringPart = mStringPart; 
    entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
    buildMultipartEntity(); 
} 

public void addStringBody(String param, String value) { 
    mStringPart.put(param, value); 
} 

private void buildMultipartEntity() { 
    entity.addPart(FILE_PART_NAME, new FileBody(mFilePart)); 
    for (Map.Entry<String, String> entry : mStringPart.entrySet()) { 
     entity.addTextBody(entry.getKey(), entry.getValue()); 
    } 
} 

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

@Override 
public byte[] getBody() throws AuthFailureError { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     httpentity = entity.build(); 
     httpentity.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); 
} 
    } 

Um Sie, damit es funktioniert dieses Java httpclients verwenden müssen: http://hc.apache.org/downloads.cgi Zu der Zeit, Ich schreibe diese Antwort (02/07/14) die Version, die ich benutze, ist 4.3.2.

Hoffe es hilft!

+0

funktionierts ??? –

+0

Ja, tut es. Versuche es ! – Leonardo

+0

Funktioniert wie ein Zauber, diese Antwort sollte akzeptiert werden! –

13

Sie müssen den folgenden Code verwenden, um Bild mit Multipart mit Volley hochzuladen. Es funktioniert wie ein Zauber in meiner App.

public class MultipartRequest extends Request<String> { 

    private MultipartEntity entity = new MultipartEntity(); 

    private static final String FILE_PART_NAME = "file"; 
    private static final String STRING_PART_NAME = "text"; 

    private final Response.Listener<String> mListener; 
    private final File mFilePart; 
    private final String mStringPart; 

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

     mListener = listener; 
     mFilePart = file; 
     mStringPart = stringPart; 
     buildMultipartEntity(); 
    } 

    private void buildMultipartEntity() 
    { 
     entity.addPart(FILE_PART_NAME, new FileBody(mFilePart)); 
     try 
     { 
      entity.addPart(STRING_PART_NAME, new StringBody(mStringPart)); 
     } 
     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); 
    } 
}