Puisque les développeurs Android recommandent d'utiliser la HttpURLConnection
classe, je me demandais si quelqu'un pouvait me donner un bon exemple sur la façon d'envoyer un "fichier" bitmap (en fait un flux en mémoire) via POST à un serveur HTTP Apache. Je ne suis pas intéressé par les cookies ou l'authentification ou quoi que ce soit de compliqué, mais je veux juste avoir une implémentation fiable et logique. Tous les exemples que j'ai vus ici ressemblent plus à "essayons ceci et peut-être que ça marche".
En ce moment, j'ai ce code:
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL("http://example.com/server.cgi");
urlConnection = (HttpURLConnection) url.openConnection();
} catch (Exception e) {
this.showDialog(getApplicationContext(), e.getMessage());
}
finally {
if (urlConnection != null)
{
urlConnection.disconnect();
}
}
où showDialog devrait simplement afficher un AlertDialog
(en cas d'URL invalide?).
Maintenant, disons que je génère un bitmap comme ceci: à l' Bitmap image = this.getBitmap()
intérieur d'un contrôle dérivé de View
et je veux l'envoyer via POST. Quelle serait la procédure appropriée pour réaliser une telle chose? Quelles classes dois-je utiliser? Puis-je utiliser HttpPost
comme dans cet exemple ? Si oui, comment pourrais-je construire le InputStreamEntity
pour mon bitmap? Je trouverais révoltant de devoir d'abord stocker le bitmap dans un fichier sur l'appareil.
Je dois également mentionner que j'ai vraiment besoin d'envoyer chaque pixel non modifié du bitmap d'origine au serveur, donc je ne peux pas le convertir en JPEG.
la source
Réponses:
Je n'ai aucune idée de la raison pour laquelle la
HttpURLConnection
classe ne fournit aucun moyen d'envoyer des fichiers sans avoir à composer le wrapper de fichier manuellement. Voici ce que j'ai fini par faire, mais si quelqu'un connaît une meilleure solution, faites-le moi savoir.Des données d'entrée:
Trucs statiques:
Configurer la demande:
Démarrer le wrapper de contenu:
Convertir
Bitmap
enByteBuffer
:Fin du wrapper de contenu:
Vider le tampon de sortie:
Avoir une réponse:
Fermer le flux de réponse:
Fermez la connexion:
PS: Bien sûr, j'ai dû encapsuler la requête
private class AsyncUploadBitmaps extends AsyncTask<Bitmap, Void, String>
, afin de rendre la plate-forme Android heureuse, car elle n'aime pas avoir des requêtes réseau sur le fil principal.la source
url
variable comme ceci:URL url = new URL("http://example.com/?param1=val1¶m2=val2");
. Vous pouvez en ajouter autant que vous le souhaitez (même si je pense qu'il y a des limites).En fait, j'ai trouvé un meilleur moyen d'envoyer des fichiers en utilisant HttpURLConnection en utilisant MultipartEntity
En supposant que vous téléchargez une image avec des données bitmap:
Et voila! Vos données de publication contiendront un champ d'image avec le nom de fichier et le chemin sur votre serveur.
la source
Pour télécharger le fichier sur le serveur avec un paramètre en utilisant
MultipartUtility
de manière simple.MultipartUtility.java
À
upload
vousfile
avec les paramètres.REMARQUE: mettez ce code ci-dessous dans non-ui-thread pour obtenir une réponse.
la source
La solution de Jaydipsinh Zala n'a pas fonctionné pour moi, je ne sais pas pourquoi mais elle semble proche de la solution.
Donc, en fusionnant celui-ci avec la grande solution et l'explication de Mihai Todor , le résultat est cette classe qui fonctionne actuellement pour moi. Si cela aide quelqu'un:
MultipartUtility2V.java
la source
Cette réponse https://stackoverflow.com/a/33149413/6481542 m'a permis de télécharger à 90% des fichiers volumineux sur un serveur de développement Django, mais j'ai dû utiliser setFixedLengthStreamingMode pour que cela fonctionne. Cela nécessite de définir Content-Length avant d'écrire le contenu, ce qui nécessite une réécriture assez importante de la réponse ci-dessus. Voici mon résultat final
L'utilisation est en grande partie la même que dans la réponse ci-dessus, mais j'ai inclus le support CSRF que Django utilise par défaut avec les formulaires
la source
basé sur la solution de Mihai, si quelqu'un a le problème de sauvegarder des images sur le serveur comme ce qui s'est passé sur mon serveur. changez la partie Bitmap en bytebuffer en:
la source
Je n'ai pas testé cela, mais vous pouvez essayer d'utiliser PipedInputStream et PipedOutputStream. Cela pourrait ressembler à quelque chose comme:
la source
Voici ce que j'ai fait pour télécharger une photo à l'aide de la demande de publication.
REMARQUE: ce code nécessite des bibliothèques. Suivez les instructions ici pour obtenir les bibliothèques.
la source
HttpClient
(votre lien est obsolète. Utilisez plutôt celui-ci ), que les gars d'Android ne conservent que pour la compatibilité ascendante, plutôt que d'utiliser le intégréHttpURLConnection
. D'un autre côté, il semble que sa configuration nécessite plus de travail, alors peut-être que cela n'en vaut pas la peine.J'ai trouvé l'utilisation d'okHttp beaucoup plus facile car je ne pouvais faire fonctionner aucune de ces solutions: https://stackoverflow.com/a/37942387/447549
la source
J'ai essayé les solutions ci-dessus et aucune n'a fonctionné pour moi hors de la boîte.
Cependant http://www.baeldung.com/httpclient-post-http-request . La demande en plusieurs parties POST ligne 6 a fonctionné en quelques secondes
la source