Je me trompe peut-être, mais je pense que vous devez implémenter les vôtres com.android.volley.toolbox.HttpStack
pour cela, car ceux par défaut ( HurlStack
si version> Gingerbread ou HttpClientStack
) ne fonctionnent pas multipart/form-data
.
Éditer:
Et en effet, j'avais tort. J'ai pu le faire en utilisant MultipartEntity
dans Request comme ceci:
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);
}
}
C'est assez brut mais je l'ai essayé avec une image et une simple chaîne et ça marche. La réponse est un espace réservé, cela n'a pas beaucoup de sens de renvoyer une chaîne de réponse dans ce cas. J'ai eu des problèmes avec apache httpmime pour utiliser MultipartEntity, j'ai donc utilisé ce https://code.google.com/p/httpclientandroidlib/ ne sais pas s'il existe un meilleur moyen. J'espère que ça aide.
Éditer
Vous pouvez utiliser httpmime sans utiliser httpclientandroidlib, la seule dépendance est httpcore.
Comme mentionné dans la présentation aux E / S (environ 4h05), Volley "est terrible" pour les charges utiles importantes. Si je comprends bien, cela signifie ne pas utiliser Volley pour recevoir / envoyer de (gros) fichiers. En regardant le code, il semble qu'il n'est même pas conçu pour gérer les données de formulaire en plusieurs parties (par exemple, Request.java a getBodyContentType () avec "application / x-www-form-urlencoded" codé en dur; HttpClientStack :: createHttpRequest () ne peut gérer que l'octet [], etc...). Vous pourrez probablement créer une implémentation capable de gérer le multipart mais si j'étais vous, je vais simplement utiliser HttpClient directement avec MultipartEntity comme:
Vous aurez peut-être besoin d' un HttpClient plus récent (c'est-à-dire pas du module intégré) ou encore mieux, utilisez Volley avec le plus récent HttpClient
la source
MISE À JOUR 2015/08/26:
Si vous ne souhaitez pas utiliser HttpEntity obsolète, voici mon exemple de code de travail (testé avec ASP.Net WebAPI)
MultipartActivity.java
BaseVolleyRequest.java:
FIN DE MISE À JOUR
Voici mon exemple de code de travail (testé uniquement avec des fichiers de petite taille):
la source
Exemple d'utilisation
la source
Une approche très simple pour les développeurs qui souhaitent simplement envoyer des paramètres POST en requête multipart.
Définissez d'abord ces constantes:
Ajoutez une fonction d'assistance pour créer un corps d'article pour vous:
Remplacer getBody () et getBodyContentType
la source
sbPost.append("--" + BOUNDARY + "--");
juste avant de revenir car l'API que j'utilise nécessite une balise de fermeturePremière réponse sur SO.
J'ai rencontré le même problème et j'ai trouvé le code de @alex très utile. J'ai fait quelques modifications simples afin de transmettre autant de paramètres que nécessaire via HashMap, et j'ai essentiellement copié
parseNetworkResponse()
depuis StringRequest. J'ai cherché en ligne et j'ai été tellement surpris de découvrir qu'une tâche aussi courante est si rarement traitée. Quoi qu'il en soit, je souhaite que le code puisse aider:Et vous pouvez utiliser la classe comme suit:
la source
Autre solution, très légère avec des performances élevées avec une charge utile importante:
Bibliothèque client Http asynchrone Android: http://loopj.com/android-async-http/
la source
Voici une solution simple et un exemple complet pour télécharger un fichier à l'aide de Volley Android
1) Importation Gradle
2) Créez maintenant un RequestManager de classe
3) Créez maintenant une classe pour gérer la demande de téléchargement de fichier WebService
4) Et maintenant, appelez la méthode comme celle-ci pour frapper le service
la source
C'est ma façon de faire. Cela peut être utile à d'autres:
la source