Ich könnte mich in dieser Sache irren, aber ich denke, Sie müssen Ihre eigene implementieren, com.android.volley.toolbox.HttpStack
da die Standard- HurlStack
Versionen ( wenn Version> Lebkuchen oder HttpClientStack
) nicht behandelt werden multipart/form-data
.
Bearbeiten:
Und tatsächlich habe ich mich geirrt. Ich konnte es mit MultipartEntity
Request wie folgt machen:
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);
}
}
Es ist ziemlich roh, aber ich habe es mit einem Bild und einer einfachen Zeichenfolge versucht und es funktioniert. Die Antwort ist ein Platzhalter. In diesem Fall ist es wenig sinnvoll, eine Antwortzeichenfolge zurückzugeben. Ich hatte Probleme mit Apache httpmime, um MultipartEntity zu verwenden, also habe ich diese https://code.google.com/p/httpclientandroidlib/ verwendet. Ich weiß nicht, ob es einen besseren Weg gibt. Ich hoffe es hilft.
Bearbeiten
Sie können httpmime ohne httpclientandroidlib verwenden. Die einzige Abhängigkeit ist httpcore.
Wie in der Präsentation im I / O (ca. 4:05) erwähnt, ist Volley für große Nutzlasten "schrecklich". Nach meinem Verständnis bedeutet dies, Volley nicht zum Empfangen / Senden von (großen) Dateien zu verwenden. Wenn man sich den Code ansieht, scheint er nicht einmal für die Verarbeitung mehrteiliger Formulardaten ausgelegt zu sein (z. B. hat Request.java getBodyContentType () mit fest codiertem "application / x-www-form-urlencoded"; HttpClientStack :: createHttpRequest () kann nur Byte verarbeiten [], etc...). Wahrscheinlich können Sie eine Implementierung erstellen, die mehrteilig ist, aber wenn ich Sie wäre, würde ich HttpClient direkt mit MultipartEntity verwenden, wie:
Möglicherweise benötigen Sie einen neueren HttpClient (dh nicht den integrierten) oder verwenden Volley mit einem neueren HttpClient
quelle
UPDATE 26.08.2015:
Wenn Sie kein veraltetes HttpEntity verwenden möchten, finden Sie hier meinen Arbeitsbeispielcode (getestet mit ASP.Net WebAPI).
MultipartActivity.java
BaseVolleyRequest.java:
ENDE DES UPDATE
Dies ist mein funktionierender Beispielcode (nur mit kleinen Dateien getestet):
quelle
Beispielnutzung
quelle
Ein sehr einfacher Ansatz für Entwickler, die nur POST-Parameter in mehrteiligen Anforderungen senden möchten.
Definieren Sie zuerst diese Konstanten:
Fügen Sie eine Hilfsfunktion hinzu, um einen Post-Body für Sie zu erstellen:
Überschreiben Sie getBody () und getBodyContentType
quelle
sbPost.append("--" + BOUNDARY + "--");
kurz vor meiner Rückkehr, da die von mir verwendete API ein schließendes Tag erfordertErste Antwort auf SO.
Ich bin auf dasselbe Problem gestoßen und fand den Code von @alex sehr hilfreich. Ich habe einige einfache Änderungen vorgenommen, um so viele Parameter wie nötig über HashMap zu übergeben, und habe im Grunde genommen
parseNetworkResponse()
von StringRequest kopiert . Ich habe online gesucht und war so überrascht, dass eine so häufige Aufgabe so selten beantwortet wird. Wie auch immer, ich wünschte, der Code könnte helfen:Und Sie können die Klasse wie folgt verwenden:
quelle
Eine andere Lösung, sehr leicht mit hoher Leistung bei großer Nutzlast:
Android Asynchronous Http Client-Bibliothek: http://loopj.com/android-async-http/
quelle
Hier ist eine einfache Lösung und ein vollständiges Beispiel für das Hochladen von Dateien mit Volley Android
1) Gradle-Import
2) Erstellen Sie nun einen Class RequestManager
3) Erstellen Sie jetzt eine Klasse für die Anforderung zum Hochladen von File WebService
4) Rufen Sie jetzt die folgende Methode auf, um den Dienst zu aktivieren
quelle
Das ist meine Art, es zu tun. Es kann für andere nützlich sein:
quelle