einfache HttpURLConnection POST-Datei multipart/form-Daten von android auf google blobstore
Habe ich sehr wenig Ahnung wie html funktioniert.Was ich tun möchte, ist genau ähnlich der folgenden aber auf android
HTML:
<body>
<form action="<%= some_url %>" method="post" enctype="multipart/form-data">
<input type="file" name="myFile">
<input type="submit" value="Submit">
</form>
</body>
Habe ich versucht den folgenden code -
private static void postToUrl(String url_to_upload_on,
String file_name_with_ext, byte[] byteArray) {
String attachmentName = "file";
String attachmentFileName = file_name_with_ext;
String crlf = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
try{
URL url = new URL(url_to_upload_on);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty(
"Content-Type", "multipart/form-data;boundary=" + boundary);
DataOutputStream request = new DataOutputStream(
connection.getOutputStream());
request.writeBytes(twoHyphens + boundary + crlf);
request.writeBytes("Content-Disposition: form-data; name=\"" +
attachmentName + "\";filename=\"" +
attachmentFileName + "\"" + crlf);
request.writeBytes(crlf);
request.write(byteArray);
request.writeBytes(crlf);
request.writeBytes(twoHyphens + boundary +
twoHyphens + crlf);
request.flush();
request.close();
}catch(Exception e){
e.printStackTrace();
}
}
das gibt mir kein direkter Fehler, aber Wann bekomme ich den error-stream-mit-
Log.w(TAG, "connection.getErrorStream() = " + connection.getErrorStream());
bekomme ich diese-
12-14 18:25:54.911: W/uploadToBlobStore(30558): httpUrlConnection.getErrorStream() = com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream@426dd5a8
ohne Erfolg.
PS - ich bin das hochladen von Dateien zu google blobstore
PS - ich kann nicht mit Apache http Bibliotheken oder seine multipart-Klasse als android sagt seiner abgeschrieben
BEARBEITEN 1
Nun bin ich mit dem folgenden code, aber es funktioniert nur für Dateien, die weniger als 2.3 Mb -
private static void postToUrl3(String url_to_upload_on,
String file_name_with_ext, byte[] byteArray, String mimeType) {
CloseableHttpClient httpClient = null;
try {
httpClient = HttpClientBuilder.create().build();
HttpPost postRequest = new HttpPost(url_to_upload_on);
MultipartEntityBuilder reqEntity = MultipartEntityBuilder.create();
reqEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
ByteArrayBody bab = new ByteArrayBody(byteArray, file_name_with_ext);
reqEntity.addPart("file", bab);
postRequest.setEntity(reqEntity.build());
httpClient.execute(postRequest);//takes time
} catch (Exception e) {
Log.w("uploadToBlobStore", "postToUrl Exception e = " + e);
e.printStackTrace();
} finally {
if (httpClient != null) {
Log.w("uploadToBlobStore", "connection.closing ");
try {
httpClient.close();
} catch (IOException e) {
Log.w("uploadToBlobStore", "connection.closing errot e = "
+ e);
e.printStackTrace();
}
}
}
}
wie machen es die Arbeit mit größeren Dateien?
PS- ich bin das senden es zu blobstore und ich habe eingestellt das maxUploadSizeBytes
und MaxUploadSizeBytesPerBlob
zu 30MB.Ich bin nicht in der Lage, herauszufinden, das Problem mit der Größe, weil google blobstore-Dokumentation sagt -
Google App Engine enthält die Blobstore-Dienst, der es Anwendungen ermöglicht, dienen die Daten Objekte, die nur begrenzt durch die Menge an Daten, die hochgeladen oder heruntergeladen werden über eine einzige HTTP-Verbindung.
So kann es ein problem mit http-Verbindung? und wenn ja, wie kann ich es konfigurieren.
- Ich war in der Lage, eine Datei hochzuladen, mit multiPartEntity, check out den code, den ich gepostet in die Antwort hier: stackoverflow.com/questions/34222980/... Tick grün, wenn es funktioniert! prost!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mit
HttpURLConnection
um dies zu erreichen.Erstellen Mehrteiliger custom class ::
Verwenden (async Weg) ::
org.apache.http.entity.mime.MultipartEntity
und Ihr code funktioniert, ein Genuss. 🙂addFormField
Methode ist das hinzufügen einer Zeile zu brechen, um den tatsächlichen Wert, der an den server gesendet wird. Um es wie beabsichtigt funktionieren, ich habe entfernt die letzten.append(LINE_FEED)
aus dieser Methode. Cheers,writer.append(value).append(LINE_FEED); writer.flush();
mitwriter.append(value); writer.flush(); writer.append(LINE_FEED);
httpConn.setRequestProperty
im Konstruktor) und-Antwort-codes > 400 nicht funktionieren (denn diese geben einenhttpConn.getErrorStream()
, nicht einhttpConn.getInputStream()
).verwenden okhttp und nutzen Sie dazu das folgende Codefragment (aus Rezepte)
passen Sie die header-Werte nach dem, was Ihr server erwartet.
okhttp
ist! Ich möchte nur betonen, zu jeder kämpft mit diesem problem, das hochladen einer Datei von Android, okhttp (derzeit okhttp3) ist der Weg zu gehen! Als ich anfing, auf diesem und sah okhttp erwähnt, ich war vorsichtig, da man immer nur ungern zu verwenden, eine freie Bibliothek, die Sie noch nie gehört haben. Jedoch, nachdem er gezwungen, diese Lösung kann ich nicht empfehlen, okhttp zu hoch. Es sieht eine starke und Wartung Datensatz ist einfach zu bedienen und zu installieren (in AndroidStudio), und löst ein problem, das die anderen Methoden nicht (für mich).Als alternative können Sie Retrofit.
Können Sie einen Anruf wie diesen:
dann erstellen Sie es wie folgt:
und schließlich führen Sie es wie folgt:
service.updateUser(Photo, description).enqueue()
--> asynchroneservice.updateUser(Photo, description).execute()
--> synchroneFinden Sie in der Dokumentation hier
Volleyball ist ein guter http-Bibliothek für die multipart-Daten.
AndroidMultiPartEntity
Klasse ist für Fortschritts-listener.