простой POST-файл HttpURLConnection multipart / form-data из Android в Google Blobstore
Я очень мало знаю, как работает HTML. То, что я хочу сделать, в точности похоже на следующеено на андроид
<body>
<form action="<%= some_url %>" method="post" enctype="multipart/form-data">
<input type="file" name="myFile">
<input type="submit" value="Submit">
</form>
</body>
Я попробовал следующий код -
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();
}
}
это не дает мне прямых ошибок, но когда я получаю поток ошибок, используя
Log.w(TAG, "connection.getErrorStream() = " + connection.getErrorStream());
я понял это
12-14 18:25:54.911: W/uploadToBlobStore(30558): httpUrlConnection.getErrorStream() = com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream@426dd5a8
без успеха.
PS - Я загружаю файл в Google Blobstore
PS - Я не могу использовать библиотеки Apache http или его составной класс, так как Android говорит, что он устарел
РЕДАКТИРОВАТЬ 1
Сейчас я использую следующий код, но он работает только для файлов менее 2,3 Мб -
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();
}
}
}
}
как заставить работать с большими файлами?
PS- я отправляю его в интернет-магазин и установилmaxUploadSizeBytes
а такжеMaxUploadSizeBytesPerBlob
до 30 МБ. Я не могу выяснить проблему с размером, потому что документация Google Blobstore говорит -
Google App Engine включает службу Blobstore, которая позволяет приложениям обслуживать объекты данных, ограниченные только объемом данных, которые можно загружать или загружать через одно соединение HTTP.
Так может ли быть проблема с http-соединением? и если да, то как я могу его настроить.