2010-07-17 3 views
3

Я хотел бы захватить изображение с камеры на 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, но для этого требуется очень много зависимостей, которые кажутся слишком раздутыми для простой задачи.

Благодаря

+0

Вам действительно нужно следить за перенаправлением? Если вам нужно только знать, что изображение было загружено успешно, вы можете просто проверить правильность перенаправления. –

+0

Да, мне нужно следить за перенаправлением. Видите ли, когда изображение загружается в Blobstore, генерируется идентификатор. Чтобы ссылаться на изображение, вам нужно записать этот идентификатор где-нибудь, что происходит в сервлете, который попал из-за перенаправления. –

ответ

4

Несколько месяцев назад я пытался сделать то же самое!

В принципе, не используйте HttpURLConnection. Вместо этого используйте HttpClient и HttpGet в пакете org.apache.http, которые являются частью Android SDK.

К сожалению, у меня нет исходного кода, чтобы представить пример, но, надеюсь, он установит вас в правильном направлении.

+0

Да, я уверен, что это решаемая проблема ... и ваш подход - это тот, который я принял, с добавлением 'MultipartEntity'. Тем не менее, я понятия не имею, почему приведенный выше код не работает. –

0

не уверен, что пошло не так, но вы можете следить за переориентировать себя. откройте заголовок Location и внесите новое соединение.

Смежные вопросы