L'envoi de fichiers à l'aide de POST avec HttpURLConnection
Puisque les développeurs Android recommander d'utiliser le HttpURLConnection
de classe, je me demandais si quelqu'un peut me fournir un bon exemple de comment envoyer une image bitmap "fichier" (en fait un flux de mémoire) par la POSTE à un serveur HTTP Apache. Je ne suis pas intéressé dans les cookies ou d'authentification ou quoi que ce soit compliqué, mais je veux juste avoir un support fiable et logique de mise en œuvre. Tous les exemples que j'ai vu ici ressemblent plus à des "nous allons essayer cela et peut-être que ça marche".
Droit maintenant, 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 faut juste afficher une AlertDialog
(dans le cas d'une URL non valide?).
Maintenant, disons que je génère une image bitmap comme suit: Bitmap image = this.getBitmap()
l'intérieur d'un contrôle dérivé de View
et je veux l'envoyer par la POSTE. Quelle serait la procédure à suivre pour réaliser une telle chose? Quels cours dois-je utiliser? Puis-je utiliser HttpPost
comme dans cet exemple? Si oui, comment pourrais-je construire le InputStreamEntity
pour mon bitmap? Je trouve ça révoltant d'être tout d'abord nécessaire de stocker l'image dans un fichier sur le périphérique.
Je devrais aussi mentionner que j'ai vraiment besoin d'envoyer tous les inchangée pixel de l'image d'origine sur le serveur, donc je ne peux pas le convertir en JPEG.
- Reportez-vous à cette SORTE de discussion
Vous devez vous connecter pour publier un commentaire.
Je n'ai aucune idée pourquoi le
HttpURLConnection
classe ne fournit aucun moyen pour envoyer des fichiers sans avoir à composer le dossier manuellement. Voici ce que j'ai fait, mais si quelqu'un connait une meilleure solution, s'il vous plaît laissez-moi savoir.Des données d'entrée:
Statique trucs:
Installation de la demande:
Commencer contenu wrapper:
Convertir
Bitmap
àByteBuffer
:De contenu wrapper:
Rincer la mémoire tampon de sortie:
Obtenir réponse:
Fermer le flux de réponse:
Fermer la connexion:
PS: bien sûr, j'avais pour envelopper la demande en
private class AsyncUploadBitmaps extends AsyncTask<Bitmap, Void, String>
, afin de rendre la plate-forme Android heureux, parce qu'il n'aime pas avoir des demandes de réseau sur le thread principal.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 certaines limites).J'ai effectivement trouvé une meilleure façon d'envoyer des fichiers à l'aide de HttpURLConnection à l'aide de MultipartEntity
En supposant que vous téléchargez une image avec les données de l'image:
Et Le Tour Est Joué! Votre message données contiendra l'image de champ avec le nom de fichier et le chemin d'accès sur votre serveur.
conn.addRequestProperty("Content-length", reqEntity.getContentLength()+"")
parce que c'était la génération d'une demande mal formulée avec un double "Content-length:" en-tête avec la valeur "-1". Apache a été la réponse de 400 Bad Request même avant que le téléchargement est terminé. Content-length est réglée automatiquement par HttpURLConnection.Pour télécharger le fichier sur le serveur avec un certain nombre de paramètres à l'aide de
MultipartUtility
de façon simple.MultipartUtility.java
À
upload
vousfile
avec les paramètres.REMARQUE : placez-y le code ci-dessous dans la non-ui-thread pour obtenir de réponse.
La solution de Jaydipsinh Zala ne fonctionne pas pour moi, je ne sais pas pourquoi, mais il semble être proche de la solution.
Donc la fusion de celui-ci avec la grande solution et une explication de Mihai Todor, le résultat est cette classe qui travaille actuellement pour moi. Si ça aide quelqu'un:
MultipartUtility2V.java
basé sur Mihai la solution, si quelqu'un a le problème de l'enregistrement des images sur le serveur, comme ce qui s'est passé sur mon serveur. modifier l'image Bitmap à bytebuffer partie :
Je n'ai pas testé, mais vous pouvez essayer en utilisant PipedInputStream et PipedOutputStream. Il pourrait ressembler à quelque chose comme:
Cette réponse https://stackoverflow.com/a/33149413/6481542 m'a fait 90% du chemin avec le téléchargement de fichiers volumineux pour un développement Django serveur, mais j'ai dû utiliser setFixedLengthStreamingMode à faire, il a travaillé. Qui nécessite le réglage de la Longueur du Contenu avant d'écrire le contenu, ce qui nécessite une assez bonne réécriture de la réponse ci-dessus. Voici mon résultat final
Utilisation est essentiellement le même que dans la réponse ci-dessus, mais j'ai inclus CSRF soutien que Django utilise par défaut avec les formes
Voici ce que j'ai fait pour le téléchargement de photos à l'aide d'une requête post.
REMARQUE: Ce code exige que les bibliothèques afin de Suivre les instructions ici afin d'obtenir les bibliothèques.
HttpClient
(votre lien est obsolète. Utiliser les celui-ci au lieu de cela), ce qui la Android les gars sont de maintenir uniquement pour la compatibilité ascendante, plutôt que d'utiliser le construit enHttpURLConnection
. D'autre part, il semble qu'il exige plus de travail pour le configurer, donc peut-être que ça ne vaut pas la peine.J'ai trouvé à l'aide de okHttp beaucoup plus facile que je ne pouvais pas obtenir l'une de ces solutions de travail: https://stackoverflow.com/a/37942387/447549
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. Ligne 6 POST Multipart Demande travaillé en quelques secondes