2013-10-09 4 views
6

Сценарий: Я пытаюсь отправить некоторые данные POST через HttpURLConnection в службу (с обновлением прогресса). Я хватаю изображение из галереи, а затем отправляю его на php-сервер с двумя параметрами; invnum и пароль.Загрузка параметров и изображений через HttpURLConnection на сервер PHP (Android)

Примечание: Если я делаю это с помощью метода HttpClient, параметры и изображения передаются и принимаются на сервере, но я не могу отслеживать процесс загрузки. Я видел несколько кодов, относящихся к пользовательскому многопользовательскому объекту, насколько это возможно. Я бы хотел избежать ссылки на библиотеку.

Я рассмотрел множество связанных вопросов в SO, но не могу найти решение. Ниже приведены текущие коды, которые у меня есть в моем сервисе.

protected void onHandleIntent(Intent intent) { 
    String invnum = intent.getStringExtra("invnum"); 
    String uploadURL = intent.getStringExtra("uploadURL"); 
    String imageURI = intent.getStringExtra("imageURI"); 
    uri = Uri.parse(imageURI); 

    String pass = "password"; 

    //get the actual path of the image residing in the phone 
    String[] filePathColumn = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = getContentResolver().query(uri,filePathColumn, null, null, null); 
    cursor.moveToFirst(); 
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
    picturePath = cursor.getString(columnIndex); 
    cursor.close(); 

    ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver"); 

    //check url 
    try { 
     File file = new File(picturePath); 
     FileInputStream fileInputStream = new FileInputStream(file); 
     byte[] bytes = new byte[(int) file.length()]; 
     fileInputStream.read(bytes); 
     fileInputStream.close(); 

     String fileName = file.getName(); 

     URL url = new URL(uploadURL); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 
     connection.setUseCaches(false); 
     connection.setConnectTimeout(30000); 
     connection.setReadTimeout(30000); 
     connection.setChunkedStreamingMode(1024); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Connection", "Keep-Alive"); 
     connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)"); 
     connection.setRequestProperty("image", fileName); 
     connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 

     DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); 

     //send multipart form data (required) for file 
     outputStream.writeBytes("Content-Disposition: form-data; name=\"image\";filename=\"" + fileName + "\"" + lineEnd); 
     outputStream.writeBytes("Content-Type: image/jpeg" + lineEnd); 
     //outputStream.writeBytes("Content-Type: " + URLConnection.guessContentTypeFromName(fileName) + lineEnd); 
     //outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); 
     //outputStream.writeBytes("Content-Type: application/octet-stream" + lineEnd); 
     outputStream.writeBytes("Content-Length: " + file.length() + lineEnd); 
     outputStream.writeBytes(lineEnd); 

     int bufferLength = 1024; 
     for (int i = 0; i < bytes.length; i += bufferLength) { 
      // publishing the progress.... 
      Bundle resultData = new Bundle(); 
      resultData.putInt("progress" ,(int)((i/(float) bytes.length) * 100)); 
      receiver.send(UPDATE_PROGRESS, resultData); 

      if (bytes.length - i >= bufferLength) { 
       outputStream.write(bytes, i, bufferLength); 
      } else { 
       outputStream.write(bytes, i, bytes.length - i); 
      } 
     } 

     //end output 
     outputStream.writeBytes(lineEnd); 

     //write more parameters other than the file 
     outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
     //outputStream.writeBytes(twoHyphens + boundary + lineEnd); //less twohyphens 
     outputStream.writeBytes("Content-Disposition: form-data; name=\"invnum\"" + lineEnd); 
     //outputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd); 
     //outputStream.writeBytes("Content-Length: " + invnum.length() + lineEnd); 
     outputStream.writeBytes(lineEnd); 
     outputStream.writeBytes(invnum + lineEnd); 
     outputStream.writeBytes(twoHyphens + boundary + lineEnd); 

     outputStream.writeBytes("Content-Disposition: form-data; name=\"pass\"" + lineEnd); 
     //outputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd); 
     //outputStream.writeBytes("Content-Length: " + pass.length() + lineEnd); 
     outputStream.writeBytes(lineEnd); 
     outputStream.writeBytes(pass + lineEnd); 
     outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 

     // publishing the progress.... 
     Bundle resultData = new Bundle(); 
     resultData.putInt("progress", 100); 
     receiver.send(UPDATE_PROGRESS, resultData); 

     outputStream.flush(); 
     outputStream.close(); 
     //input ignored for now 

    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

При запуске приложения, прогресс отражается красиво, но при проверке на моем сервере, никакие файлы не загружаются вообще. Фактически никакие данные не отправляются или не принимаются сервером. Кто-нибудь знает, что может вызвать эту проблему? Ниже приведен код сервера.

$pass = $_POST['pass']; 
$invnum = $_POST['invnum']; 
$image = $_POST['image']; 
if ($pass == 'password') { 
    //do something 
} 

Обновление: Для начала, я получаю ошибку 404 из HttpURLConnection. Мой url выглядит примерно так: «http://www.xyz.com/upload.php». Обновление до прежнего предложения, удалив «setChunkedStreamingMode», я могу успешно загрузить параметры на сервер, но не изображение! Я рядом!

+0

http://stackoverflow.com/a/23648537/1318946 –

ответ

0

В методе андроида HttpClient лучше, чем HttpUrlConnection. Я показываю только способ exceute post с HttpClient. Я использовал этот сборщик;

HttpClient client = new DefaultHttpClient(); 
HttpPost post = new HttpPost(); 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(<n>);// you have pass, invnum and image 
nameValuePairs.add(new BasicNameValuePair("image", "<filName>")); 
post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
client.execute(post); 
+1

Этот метод работает, но это не то, что я ищу, я не могу отслеживать ход загрузки с использованием HttpClient. – dionkta

+0

Возможно, вы проверите http://stackoverflow.com/questions/7057342/how-to-get-a-progress-bar-for-a-file-upload-with-apache-httpclient-4 – nurisezgin

+1

Вы ошиблись в отношении андроида Методы httpclient лучше. В общем, httpurlconnection было улучшено больше для более новых версий Android. Подробнее читайте здесь: http://android-developers.blogspot.de/2011/09/androids-http-clients.html – Warpzit

7

Наконец получил его на работу ...

Линия "connection.setChunkedStreamingMode (1024);" вызывает проблему. После этого удалите параметры и файл. Остается одна второстепенная проблема, ход загрузки неточен. Достигнутый прогресс - это фактически заполненный буфер, который почти мгновен даже для 3 МБ изображения. Файл по-прежнему загружается в фоновом режиме после того, как прогресс достиг 100. Предположим, что это будет другой вопрос в другое время.

+1

Вы когда-нибудь выясняли, как решить эту проблему? Я пытаюсь сделать то же самое, но все, кажется, думают, что они отслеживают процесс загрузки, когда они на самом деле просто отслеживают запись на масло (как вы сказали). – Brian

+0

спасибо большое чувак. Я был раздражен этой проблемой с недели. наконец, с твоим ответом ... очень спасибо много ... – ELITE

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