2014-08-27 74 views
1

我正在嘗試構建http請求正文,它將從android設備發送圖像以及一些參數到服務器。如何將HTTP多部分請求正文一起發送一些字符串參數以及圖像

現在發送圖像就像它應該,這是代碼的一部分bulds HTTP請求的身體爲目的

conn.setDoInput(true); // Allow Inputs 
      conn.setDoOutput(true); // Allow Outputs 
      conn.setUseCaches(false); // Don't use a Cached Copy 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Connection", "Keep-Alive"); 
      conn.setRequestProperty("ENCTYPE", "multipart/form-data"); 
      conn.setRequestProperty("Content-Type", 
        "multipart/form-data;boundary=" + boundary); 
      conn.setRequestProperty("uploaded_file", fileName); 

      dos = new DataOutputStream(conn.getOutputStream()); 

      dos.writeBytes(twoHyphens + boundary + lineEnd); 
      dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\"; filename=\"" 
        + fileName + "\"" + lineEnd); 

我每次嘗試添加PARAMS我會檢索POST陣列是不明智的,但一般我試圖增加這個:

dos.writeBytes(twoHyphens + boundary + lineEnd); 
dos.writeBytes("Content-Disposition: form-data; name=\"param1\""); 
dos.writeBytes(lineEnd); 

無論如何這是正確的方向邁出的一步?

+0

https://www.ietf.org/rfc/rfc1867.txt – Selvin 2014-08-27 14:41:18

回答

6
HashMap<String, String> formValues = new HashMap<String, String>(); 
     HashMap<String, String> fileValues = new HashMap<String, String>(); 

     formValues.put("text_request_parameter", f_name);  
      fileValues.put("file_request_parameter", file_path); 

       WebServiceUtil wUtil = new WebServiceUtil(this, serverUri, formValues,true, fileValues); 
      /*if you want to request text only 
       /WebServiceUtil wUtil = new WebServiceUtil(this, serverUri, formValues,false, fileValues);*/ 

     wUtil.execute(); 

// WebServiceUtil.java 

    import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.AsyncTask; 

public class WebServiceUtil extends AsyncTask<String, Integer, String> { 

    HashMap<String, String> formValues; 
    HashMap<String, String> fileValues; 

    Boolean uploadFile; 
    String reqUrl; 
    String result; 
    ProgressDialog dialog; 
    Context context; 

    public WebServiceUtil(Context context, String reqUrl, 
      HashMap<String, String> formValues, Boolean uploadFile, 
      HashMap<String, String> fileValues) { 

     this.context = context; 
     this.reqUrl = reqUrl; 
     this.formValues = formValues; 

     this.uploadFile = uploadFile; 
     if (uploadFile) { 

      this.fileValues = fileValues; 
     } 
    } 

    @Override 
    protected void onPreExecute() { 

     super.onPreExecute(); 

    } 

    // 

    @Override 
    protected String doInBackground(String... URLs) { 

     List<String> response = null; 
     try { 
      MultipartUtility mu = new MultipartUtility(context, reqUrl, "UTF-8"); 

      for (Map.Entry<String, String> entry : formValues.entrySet()) { 
       String key = entry.getKey(); 

       String value = entry.getValue(); 

       mu.addFormField(key, value); 

      } 

      if (uploadFile) { 

       for (Map.Entry<String, String> entry : fileValues.entrySet()) { 
        String key = entry.getKey(); 

        String value = entry.getValue(); 

        File file = new File(value); 
        mu.addFilePart(key, file); 

       } 

      } 

      response = mu.finish(); 

     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

     return response.toString(); 

    } 

    protected void onPostExecute(String result) { 

    } 

} 

MultipartUtility.java適於從codejava.net

import java.io.BufferedReader; 
  
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 
import java.util.List; 
import android.app.ProgressDialog; 
import android.content.Context; 

/** 
* This utility class provides an abstraction layer for sending multipart HTTP 
* POST requests to a web server. 
* @author www.codejava.net 
* 
*/ 
public class MultipartUtility { 
    private final String boundary; 
    private static final String LINE_FEED = "\r\n"; 
    private HttpURLConnection httpConn; 
    private String charset; 
    private OutputStream outputStream; 
    private PrintWriter writer; 
    ProgressDialog dialog; 

    /** 
    * This constructor initializes a new HTTP POST request with content type 
    * is set to multipart/form-data 
    * @param requestURL 
    * @param charset 
    * @throws IOException 
    */ 
    public MultipartUtility(Context context,String requestURL, String charset) 
      throws IOException { 
     //dialog = new ProgressDialog(context); 
     this.charset = charset; 

     // creates a unique boundary based on time stamp 
     boundary = "===" + System.currentTimeMillis() + "==="; 

     URL url = new URL(requestURL); 
     httpConn = (HttpURLConnection) url.openConnection(); 
     httpConn.setUseCaches(false); 
     httpConn.setDoOutput(true); // indicates POST method 
     httpConn.setDoInput(true); 
     httpConn.setRequestProperty("Content-Type", 
       "multipart/form-data; boundary=" + boundary); 
     httpConn.setRequestProperty("User-Agent", "CodeJava Agent"); 
     httpConn.setRequestProperty("Test", "Bonjour"); 
     outputStream = httpConn.getOutputStream(); 
     writer = new PrintWriter(new OutputStreamWriter(outputStream, charset), 
       true); 
    } 

    /** 
    * Adds a form field to the request 
    * @param name field name 
    * @param value field value 
    */ 
    public void addFormField(String name, String value) { 
     writer.append("--" + boundary).append(LINE_FEED); 
     writer.append("Content-Disposition: form-data; name=\"" + name + "\"") 
       .append(LINE_FEED); 
     writer.append("Content-Type: text/plain; charset=" + charset).append(
       LINE_FEED); 
     writer.append(LINE_FEED); 
     writer.append(value).append(LINE_FEED); 
     writer.flush(); 
    } 

    /** 
    * Adds a upload file section to the request 
    * @param fieldName name attribute in <input type="file" name="..." /> 
    * @param uploadFile a File to be uploaded 
    * @throws IOException 
    */ 
    public void addFilePart(String fieldName, File uploadFile) 
      throws IOException { 
     String fileName = uploadFile.getName(); 
     writer.append("--" + boundary).append(LINE_FEED); 
     writer.append(
       "Content-Disposition: form-data; name=\"" + fieldName 
         + "\"; filename=\"" + fileName + "\"") 
       .append(LINE_FEED); 
     writer.append(
       "Content-Type: " 
         + URLConnection.guessContentTypeFromName(fileName)) 
       .append(LINE_FEED); 
     writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED); 
     writer.append(LINE_FEED); 
     writer.flush(); 

     FileInputStream inputStream = new FileInputStream(uploadFile); 
     byte[] buffer = new byte[4096]; 
     int bytesRead = -1; 
     while ((bytesRead = inputStream.read(buffer)) != -1) { 
      outputStream.write(buffer, 0, bytesRead); 
     } 
     outputStream.flush(); 
     inputStream.close(); 

     writer.append(LINE_FEED); 
     writer.flush();  
    } 

    /** 
    * Adds a header field to the request. 
    * @param name - name of the header field 
    * @param value - value of the header field 
    */ 
    public void addHeaderField(String name, String value) { 
     writer.append(name + ": " + value).append(LINE_FEED); 
     writer.flush(); 
    } 

    /** 
    * Completes the request and receives response from the server. 
    * @return a list of Strings as response in case the server returned 
    * status OK, otherwise an exception is thrown. 
    * @throws IOException 
    */ 
    public List<String> finish() throws IOException { 


     List<String> response = new ArrayList<String>(); 

     writer.append(LINE_FEED).flush(); 
     writer.append("--" + boundary + "--").append(LINE_FEED); 
     writer.close(); 

     // checks server's status code first 
     int status = httpConn.getResponseCode(); 
     if (status == HttpURLConnection.HTTP_OK) { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        httpConn.getInputStream())); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       response.add(line); 
      } 
      reader.close(); 
      httpConn.disconnect(); 
     } else { 
      throw new IOException("Server returned non-OK status: " + status); 
     } 


     return response; 
    } 
} 
相關問題