Da empfehlen die Android-Entwickler die Verwendung desHttpURLConnection
Klasse , habe ich mich gefragt, ob mir jemand ein gutes Beispiel dafür geben kann, wie eine Bitmap- "Datei" (eigentlich ein In-Memory-Stream) per POST an einen Apache-HTTP-Server gesendet wird. Ich bin nicht an Cookies oder Authentifizierung oder etwas Kompliziertem interessiert, aber ich möchte nur eine zuverlässige und logische Implementierung. Alle Beispiele, die ich hier gesehen habe, sehen eher aus wie "Lass es uns versuchen und vielleicht funktioniert es".
Im Moment habe ich diesen 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();
}
}
wo showDialog nur eine anzeigen soll AlertDialog
(im Falle einer ungültigen URL?).
Nehmen wir nun an, ich generiere eine Bitmap wie folgt: Bitmap image = this.getBitmap()
In einem Steuerelement, das von abgeleitet ist, View
und ich möchte es per POST senden. Was wäre das richtige Verfahren, um so etwas zu erreichen? Welche Klassen muss ich verwenden? Kann ich HttpPost
wie in diesem Beispiel verwenden ? Wenn ja, wie würde ich die InputStreamEntity
für meine Bitmap erstellen? Ich würde es als abstoßend empfinden, die Bitmap zuerst in einer Datei auf dem Gerät zu speichern.
Ich sollte auch erwähnen, dass ich wirklich jedes unveränderte Pixel der ursprünglichen Bitmap an den Server senden muss, damit ich es nicht in JPEG konvertieren kann.
quelle
Antworten:
Ich habe keine Ahnung, warum die
HttpURLConnection
Klasse keine Möglichkeit bietet, Dateien zu senden, ohne den Datei-Wrapper manuell erstellen zu müssen. Folgendes habe ich letztendlich getan, aber wenn jemand eine bessere Lösung kennt, lassen Sie es mich bitte wissen.Eingabedaten:
Statisches Zeug:
Richten Sie die Anfrage ein:
Starten Sie den Content Wrapper:
Konvertieren
Bitmap
inByteBuffer
:Inhalts-Wrapper beenden:
Ausgangspuffer leeren:
Erhalten Antwort:
Antwortstrom schließen:
Schließen Sie die Verbindung:
PS: Natürlich musste ich die Anfrage
private class AsyncUploadBitmaps extends AsyncTask<Bitmap, Void, String>
einpacken, um die Android-Plattform glücklich zu machen, weil sie keine Netzwerkanfragen im Haupt-Thread haben möchte.quelle
url
Variablen wie folgt hinzufügen :URL url = new URL("http://example.com/?param1=val1¶m2=val2");
. Sie können so viele hinzufügen, wie Sie möchten (obwohl ich denke, dass es einige Grenzen gibt).Ich habe tatsächlich einen besseren Weg gefunden, um Dateien mit HttpURLConnection mit MultipartEntity zu senden
Angenommen, Sie laden ein Bild mit Bitmap-Daten hoch:
Und Voila! Ihre Post-Daten enthalten ein Bildfeld sowie den Dateinamen und den Pfad auf Ihrem Server.
quelle
Hochladen von Dateien auf den Server mit einigen Parametern
MultipartUtility
auf einfache Weise.MultipartUtility.java
Um
upload
Siefile
zusammen mit Parametern.HINWEIS: Fügen Sie diesen Code unten in einen Nicht-UI-Thread ein, um eine Antwort zu erhalten.
quelle
Die Lösung von Jaydipsinh Zala hat bei mir nicht funktioniert, ich weiß nicht warum, aber sie scheint der Lösung nahe zu sein.
Das Ergebnis ist diese Klasse, die derzeit für mich funktioniert, wenn ich diese mit der großartigen Lösung und Erklärung von Mihai Todor verschmelze . Wenn es jemandem hilft:
MultipartUtility2V.java
quelle
Diese Antwort https://stackoverflow.com/a/33149413/6481542 brachte mich zu 90% zum Hochladen großer Dateien auf einen Entwicklungs-Django-Server, aber ich musste setFixedLengthStreamingMode verwenden , damit es funktionierte. Dazu muss die Inhaltslänge vor dem Schreiben des Inhalts festgelegt werden, sodass die obige Antwort ziemlich neu geschrieben werden muss. Hier ist mein Endergebnis
Die Verwendung ist weitgehend dieselbe wie in der obigen Antwort, aber ich habe die CSRF-Unterstützung aufgenommen, die Django standardmäßig für Formulare verwendet
quelle
basierend auf Mihais Lösung, wenn jemand das Problem hat, Bilder auf dem Server zu speichern, wie es auf meinem Server passiert ist. Ändern Sie die Bitmap in den Bytebuffer-Teil in:
quelle
Ich habe dies nicht getestet, aber Sie könnten versuchen, PipedInputStream und PipedOutputStream zu verwenden. Es könnte ungefähr so aussehen:
quelle
Hier ist, was ich getan habe, um ein Foto per Post-Anfrage hochzuladen.
HINWEIS: Für diesen Code sind Bibliotheken erforderlich. Befolgen Sie daher die Anweisungen hier , um die Bibliotheken abzurufen.
quelle
HttpClient
(Ihr Link veraltet ist. Verwenden Sie diese eine Stelle), die die Android Jungs nur für die Abwärtskompatibilität halten, anstatt den Einsatz in den integriertenHttpURLConnection
. Auf der anderen Seite sieht es so aus, als ob mehr Arbeit erforderlich ist, um es einzurichten. Vielleicht ist es die Mühe nicht wert.Ich fand die Verwendung von okHttp viel einfacher, da ich keine dieser Lösungen zum Laufen bringen konnte: https://stackoverflow.com/a/37942387/447549
quelle
Ich habe die oben genannten Lösungen ausprobiert und keine hat sofort für mich funktioniert.
Allerdings http://www.baeldung.com/httpclient-post-http-request . Zeile 6 POST Multipart Request funktionierte innerhalb von Sekunden
quelle