Я хотел бы захватить изображение с камеры на Android и отправить его в Google App Engine, который сохранит изображение в хранилище blob. Звучит достаточно просто, и я могу получить многопользовательский POST для GAE, но для сохранения в хранилище Blob сервлет возвращает HTTP-перенаправление (302). Таким образом, мне нужно подключение, которое может следовать за перенаправлениями после выполнения HTTP POST. Вот код, который я ЖЕЛАЕМ будет работать:Лучший подход: HTTP POST (многочастный) от Android до GAE
public static String sendPhoto(String myUrl, byte[] imageData) {
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
String pathToOurFile = "/data/file_to_send.jpg";
String urlServer = myUrl;
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
// Please follow redirects
HttpURLConnection.setFollowRedirects(true);
BufferedReader rd = null;
StringBuilder sb = null;
String line = null;
try {
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// I really want you to follow redirects
connection.setInstanceFollowRedirects(true);
connection.setConnectTimeout(10000); // 10 sec
connection.setReadTimeout(10000); // 10 sec
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
connection.connect();
outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream
.writeBytes("Content-Disposition: form-data; name="
+ "\"file1\";filename=\""
+ pathToOurFile + "\"" + lineEnd);
outputStream.writeBytes(lineEnd);
outputStream.write(imageData);
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens
+ lineEnd);
outputStream.flush();
outputStream.close();
rd = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
sb = new StringBuilder();
while ((line = rd.readLine()) != null) {
sb.append(line + '\n');
}
Log.i("Response: ", sb.toString());
// Responses from the server (code and message)
int serverResponseCode = connection.getResponseCode();
String serverResponseMessage = connection.getResponseMessage();
Log.i("Response: serverResponseCode:",
String.valueOf(serverResponseCode));
Log.i("Response: serverResponseMessage:", serverResponseMessage);
} catch (Exception ex) {
ex.printStackTrace();
}
}
Столько, сколько я стараюсь, этот код не будет следовать переадресации. Входной пар всегда пуст, и ответ всегда равен 302. Изображение загружается красиво, хотя. Если кто-то может сказать мне, что я могу сделать, чтобы заставить его следовать перенаправлению, чтобы я мог прочитать ответ, я был бы очень признателен.
В качестве альтернативы, если есть лучший подход, я бы хотел его услышать. Я знаю, что есть библиотеки, такие как Apache HTTP Client, но для этого требуется очень много зависимостей, которые кажутся слишком раздутыми для простой задачи.
Благодаря
Вам действительно нужно следить за перенаправлением? Если вам нужно только знать, что изображение было загружено успешно, вы можете просто проверить правильность перенаправления. –
Да, мне нужно следить за перенаправлением. Видите ли, когда изображение загружается в Blobstore, генерируется идентификатор. Чтобы ссылаться на изображение, вам нужно записать этот идентификатор где-нибудь, что происходит в сервлете, который попал из-за перенаправления. –