2016-01-21 37 views
4

我試圖將文件與其他參數一起發佈到我的API。使用HttpURLConnection POST000與其他表單數據的文件

例如, POST /媒體 與參數

文件名= 'test.png'

文件= -the-實際文件級

我可以成功地與郵差(使用形狀數據)執行此操作,所以事情的api方面都很好。

這裏是我的Android代碼使用HttpURLConnection類:

nameValuePairs.add(new BasicNameValuePair("filename", "test.png")); 

URL object = new URL(url); 
HttpURLConnection connection = (HttpURLConnection) object.openConnection(); 
connection.setReadTimeout(60 * 1000); 
connection.setConnectTimeout(60 * 1000); 
String auth = username+":"+password; 
    byte[] data = auth.getBytes(); 
    String encodeAuth = "Basic " + Base64.encodeToString(data, Base64.DEFAULT); 
    connection.setDoInput(true); 
    connection.setDoOutput(true); 
    connection.setUseCaches(false); 
    connection.setRequestProperty("Authorization", encodeAuth); 
    connection.setRequestProperty("Accept", ACCEPT); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("ENCTYPE", "multipart/form-data"); 
    connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
    dataOutputStream = new DataOutputStream(connection.getOutputStream()); 
    writer = new BufferedWriter(new OutputStreamWriter(dataOutputStream, "UTF-8")); 
    writer.write(getQuery(nameValuePairs)); 

    writer.write("&file=" + "image.jpg"); 
    writer.write 
    File file = getFile(item); 
    if (file == null) { 
     Log.e("uploadFile", "Source File not exist "); 
    } else { 
     addFilePart("file", file); 
    } 
    } 
    writer.flush(); 
    writer.close(); 
    dataOutputStream.close(); 


    connection.connect(); 
+0

[Android中上傳大文件,而不OutOfMemory錯誤](可能的重複http://stackoverflow.com/questions/9630430/upload-large-file-in-android-without-outofmemory-error) –

+0

[如何在android中將多部分表單數據和圖像上傳到服務器?](http://stackoverflow.com/questions/19026256 /如何上傳多部分形式的數據和圖像到服務器在Android) – Sufian

回答

18

Android的多載。

public String multipartRequest(String urlTo, Map<String, String> parmas, String filepath, String filefield, String fileMimeType) throws CustomException { 
     HttpURLConnection connection = null; 
     DataOutputStream outputStream = null; 
     InputStream inputStream = null; 

     String twoHyphens = "--"; 
     String boundary = "*****" + Long.toString(System.currentTimeMillis()) + "*****"; 
     String lineEnd = "\r\n"; 

     String result = ""; 

     int bytesRead, bytesAvailable, bufferSize; 
     byte[] buffer; 
     int maxBufferSize = 1 * 1024 * 1024; 

     String[] q = filepath.split("/"); 
     int idx = q.length - 1; 

     try { 
      File file = new File(filepath); 
      FileInputStream fileInputStream = new FileInputStream(file); 

      URL url = new URL(urlTo); 
      connection = (HttpURLConnection) url.openConnection(); 

      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setUseCaches(false); 

      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Connection", "Keep-Alive"); 
      connection.setRequestProperty("User-Agent", "Android Multipart HTTP Client 1.0"); 
      connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); 

      outputStream = new DataOutputStream(connection.getOutputStream()); 
      outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
      outputStream.writeBytes("Content-Disposition: form-data; name=\"" + filefield + "\"; filename=\"" + q[idx] + "\"" + lineEnd); 
      outputStream.writeBytes("Content-Type: " + fileMimeType + lineEnd); 
      outputStream.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); 

      outputStream.writeBytes(lineEnd); 

      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      buffer = new byte[bufferSize]; 

      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
      while (bytesRead > 0) { 
       outputStream.write(buffer, 0, bufferSize); 
       bytesAvailable = fileInputStream.available(); 
       bufferSize = Math.min(bytesAvailable, maxBufferSize); 
       bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
      } 

      outputStream.writeBytes(lineEnd); 

      // Upload POST Data 
      Iterator<String> keys = parmas.keySet().iterator(); 
      while (keys.hasNext()) { 
       String key = keys.next(); 
       String value = parmas.get(key); 

       outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
       outputStream.writeBytes("Content-Disposition: form-data; name=\"" + key + "\"" + lineEnd); 
       outputStream.writeBytes("Content-Type: text/plain" + lineEnd); 
       outputStream.writeBytes(lineEnd); 
       outputStream.writeBytes(value); 
       outputStream.writeBytes(lineEnd); 
      } 

      outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 


      if (200 != connection.getResponseCode()) { 
       throw new CustomException("Failed to upload code:" + connection.getResponseCode() + " " + connection.getResponseMessage()); 
      } 

      inputStream = connection.getInputStream(); 

      result = this.convertStreamToString(inputStream); 

      fileInputStream.close(); 
      inputStream.close(); 
      outputStream.flush(); 
      outputStream.close(); 

      return result; 
     } catch (Exception e) { 
      logger.error(e); 
      throw new CustomException(e); 
     } 

    } 

    private String convertStreamToString(InputStream is) { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 

     String line = null; 
     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     return sb.toString(); 
    } 

調用代碼:

//setup params 
Map<String, String> params = new HashMap<String, String>(2); 
     params.put("foo", hash); 
     params.put("bar", caption); 

String result = multipartRequest(URL_UPLOAD_VIDEO, params, pathToVideoFile, "video", "video/mp4"); 
//next parse result string 

參考鏈接https://stackoverflow.com/a/26145565/1143026

+0

工程就像一個魅力! – Khriz

+0

最好將問題標記爲重複,而不是複製粘貼答案。 – Sufian

+0

代碼如何顯示,如果我應該添加一個字段...說密碼 –

0

接受的答案,如果你使用的是nanoHttpd服務器端需要一個小的更新,因爲這個問題花了很多的調試時間。並不得不使用失眠症的下面時間表源代碼來理解這個問題。 Insomnia screenshot for multipart upload timeline 只是避免使用(//註釋掉)outputStream.writeBytes("Content-Type: text/plain" + lineEnd); ,因爲這最終崗位參數設置爲null

相關問題