1

У меня есть приложение для Android, которое отправляет на сервер 1 или более ZIP-файлов. Я бы хотел отправить дополнительные данные формы вместе с файлами, потому что данные формы будут использоваться для определения расположения файлов.Как загрузить как данные формы, так и несколько файлов из моего приложения Android, используя HTTPURLConnection на моем сервере, где я использую PHP?

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

Что я хотел бы знать, как отправить данные формы и список файлов на сервер, используя HTTPUrlConnection на стороне android и PHP на стороне сервера.

Я считаю, что моя проблема связана с Content-Type и Content-Disposition. Я был бы очень признателен, если бы кто-нибудь мог указать мне на конкретный пример или объяснить, что я делаю неправильно.

Спасибо, что нашли время, чтобы посмотреть на эту проблему. '

Вот последняя, ​​переработанное андроид код:

String postDriverUpload(File[] fileList) { 
     HttpURLConnection connection = null; 
     DataOutputStream outputStream = null; 
     String tag = TAG + "postDriverInfo()"; 
     URL url = null; 
     String result = OK_TO_CONTINUE; 

     String targetUrl = server + "/upload.php"; 

     try { 
      url = new URL(targetUrl); 
     } catch (MalformedURLException e) { 
      result = "ERROR: [" + targetUrl + "] can't be parsed into a URL."; 
      Log.e(tag, result, e); 
      return result; 
     } 

     try { 
      connection = (HttpURLConnection) url.openConnection(); 
     } catch (IOException e) { 
      result = "ERROR: IOException."; 
      Log.e(tag, result, e); 
      return result; 
     } 

     // Allow Inputs and Outputs 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 
     connection.setUseCaches(false); 

     // Enable POST method 

     try { 
      connection.setRequestMethod("POST"); 
     } catch (ProtocolException e) { 
      result = "Error: Protocol Exception."; 
      Log.e(tag, result, e); 
      return result; 
     } 

     connection.setRequestProperty("Connection", "Keep-Alive"); 
     connection.setRequestProperty("Content-Type", 
       "multipart/form-data;boundary=" + BOUNDARY); 

     // Encode driver userName 
     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     try { 
      nameValuePairs.add(new BasicNameValuePair("userName", driver 
        .getUserName())); 
      Log.d(tag, "Encoded userName='driver' is: " 
        + encodeData(nameValuePairs)); 

      // Create output Stream to send data to server 
      outputStream = new DataOutputStream(connection.getOutputStream()); 
      writeBoundary(outputStream); 
      outputStream 
        .writeBytes("Content-Disposition: form-data; name=\"userName\" " 
          + EOL + EOL); 
      outputStream.writeBytes(driver.getUserName() + EOL); 
      writeBoundary(outputStream); 

      // Starting the Files part 
      outputStream 
        .writeBytes("Content-Disposition: form-data; name=\"files\" " 
          + EOL + EOL); 
      outputStream.writeBytes("Content-Type: multipart/mixed; boundary=" 
        + FILE_BOUNDARY + EOL); 
      // Adding the file parts 
      for (File file : fileList) { 
       writeFileBoundary(outputStream); 
       // write out file 
       String contentType = String.format(
         "Content-Disposition:file; filename=\"%s\"" + EOL 
           + "Content-Type: application/x-zip-compressed", 
         file.getName()) 
         + EOL + EOL; 
       Log.d(tag, "Content-Type = " + contentType); 
       outputStream.write(contentType.getBytes()); 
      } 
      writeFileBoundary(outputStream); 
      writeBoundary(outputStream); 
      outputStream.flush(); 
      outputStream.close(); 
     } catch (UnsupportedEncodingException e) { 
      result = "Error: UnsupportedEncodingException "; 
      Log.e(tag, result, e); 
      return result; 
     } catch (IOException e) { 
      result = "Error: IOException "; 
      Log.e(tag, result, e); 
      return result; 
     } 

     // Get Response from server (code and message) 
     try { 
      int serverResponseCode = connection.getResponseCode(); 
      String serverResponseMessage = connection.getResponseMessage(); 
      Log.d(tag, "Response Code = " + serverResponseCode); 
      Log.d(tag, "Response Message = " + serverResponseMessage); 
     } catch (IOException e) { 
      result = "Error getting response from server."; 
      Log.e(tag, result, e); 
      return result; 
     } 
     final StringBuilder out = new StringBuilder(); 
     try { 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        connection.getInputStream())); 
      String line; 
      while (null != (line = in.readLine())) { 
       if (line.contains("ERROR")) { 
        Log.d(tag, "HTTPResponse: " + out.toString()); 
        result = "Error: HTTPResponse: " + out.toString(); 
        break; 
       } 
       out.append(line + "\n\n"); 
      } 
      Log.d(tag, "HTTPResponse: " + out.toString()); 

     } catch (IOException e) { 
      Log.w(tag, "WARNING: ", e); 
     } 

     return result; 
    } 


void writeBoundary(DataOutputStream out) throws IOException { 
    final String twoHyphens = "--"; 
    out.writeBytes(twoHyphens + BOUNDARY + EOL); 
} 

void writeFileBoundary(DataOutputStream out) throws IOException { 
    final String twoHyphens = "--"; 
    out.writeBytes(twoHyphens + FILE_BOUNDARY + EOL); 
} 

Вот результат моего протоколирования на Android стороне. Как вы можете видеть, ключ, userName и значение, rbenjamin, должным образом загружаются в переменную $ _POST, но что-то не проходит мимо этого момента. Я разделяю следующий раздел с ГРАНИЦЕЙ, но он, похоже, поглощен значением для переменных «файлы». Я рядом, но я все еще что-то упускаю. (Я раздели большую часть шума в лог-файле ниже.)

: Upload Button Clicked. 
: Compiling upload file 
: getting delivered SQL = SELECT * FROM deliveryorder WHERE delivereddatetime != '' 
: uploadEnabled = true 
: downloadEnabled = false 
: driverEmail = [email protected] 
: Starting, getting database. 
: Found 1 drivers. 
: Processing driver 1 
: user name is rbenjamin 
: email is [email protected] 
: Uploading files using HTTP to http://192.168.1.17:8080 
: There are 16 files. 
: Checking download - enabled? false 
: Encoded userName='driver' is: userName=rbenjamin 
: Content-Type = Content-Disposition:file; filename="upload20130820_1015.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130820_1048.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1624.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1628.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1645.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1647.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1705.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1709.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1746.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1801.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1804.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1811.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1813.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_1821.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130821_2050.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Content-Type = Content-Disposition:file; filename="upload20130825_1957.zip" 

: Content-Type: application/x-zip-compressed 

: 

: Response Code = 200 
: Response Message = OK 
: HTTPResponse: <!DOCTYPE html> 
: <html> 
: <body> 
: POST is defined.<br>Key = userName"_, Value = rbenjamin<br>Key = files"_, Value = Content-Type: multipart/mixed; boundary=**FILE*BOUNDARY***[email protected]*** 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130820_1015.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130820_1048.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1624.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1628.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1645.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1647.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1705.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1709.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1746.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1801.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1804.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1811.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1813.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_1821.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130821_2050.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]*** 
: Content-Disposition:file; filename="upload20130825_1957.zip" 
: Content-Type: application/x-zip-compressed 
: --**FILE*BOUNDARY***[email protected]***<br> 
: Notice: Undefined index: userName in /var/www-pbs/upload.php on line 15 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: User Name is: <br>FILES is defined.<br> 
: Notice: Undefined index: file in /var/www-pbs/upload.php on line 24 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: <p>Dumping _FILES</p> 
: Notice: Undefined index: file in /var/www-pbs/upload.php on line 34 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: Notice: Undefined index: file in /var/www-pbs/upload.php on line 40 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: Upload: <br> 
: Notice: Undefined index: file in /var/www-pbs/upload.php on line 41 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: Type : <br> 
: Notice: Undefined index: file in /var/www-pbs/upload.php on line 42 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: Size : 0 kB<br> 
: Notice: Undefined index: file in /var/www-pbs/upload.php on line 43 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: Stored in: 
: Notice: Undefined index: file in /var/www-pbs/upload.php on line 45 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: Notice: Undefined index: file in /var/www-pbs/upload.php on line 47 
: Call Stack: 
:  0.0083  638888 1. {main}() /var/www-pbs/upload.php:0 
: already exists. 
: </body> 
: </html> 
: 200 
+0

Возможный дубликат [отправить данные формы html с помощью java для загрузки загрузки из приложения jsp] (http://stackoverflow.com/questions/18153691/submit-html-form-data-using-java-to-retrive -a-download-from-a-jsp-application) (Ответ здесь - только для ссылок, цель ссылается на один и тот же ресурс вне сайта, но является автономной.) – Mogsdad

ответ

5

Никто не ответил на мой вопрос, но я в конце концов нашел то, что нужно здесь: a www.codejava.net article on sending multipart forms programatically. Это было именно то, что доктор заказал. В статье представлен класс, MultipartUtility, который упрощает загрузку с помощью HTTPURLConnection. Это не только ответ, но и хорошо структурированный. Мне пришлось немного настроить его для Android, но не так много.

+0

Это полезно для меня. Но дело в том, Мне нужно отправить несколько записей с несколькими файлами. Как я могу отправить? .. не могли бы вы дать мне некоторую идею ..? –

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

  • Нет связанных вопросов^_^