2010-04-09 48 views
5

我想用下面的參數構造一個多部分請求:name(字符串),email(字符串)和fileupload(文件)。我正在使用下面的Java代碼(在Android中工作)。幫助構建一個帶有MultipartEntity的POST請求(新手問題)

的httppost.getRequestLine()打印

POST http://www.myurl.com/upload HTTP/1.1 

所以一切看起來都在客戶端站點不錯,但我的服務器(Django的/阿帕奇),把它讀成一個GET請求,沒有GET參數 - request.method產生' GET',request.GET.items()產生一個空的字典。

我在做什麼錯?實際上我不知道如何正確設置多部分參數 - 我正在使用猜測 - 所以可能會出現這種問題。

public void SendMultipartFile() { 
    Log.e(LOG_TAG, "SendMultipartFile"); 
    DefaultHttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("http://www.myurl.com/upload"); 
    File file = new File(Environment.getExternalStorageDirectory(), 
    "video.3gp"); 
    Log.e(LOG_TAG, "setting up multipart entity"); 
    MultipartEntity mpEntity = new MultipartEntity(); 
    ContentBody cbFile = new FileBody(file); 
    mpEntity.addPart("fileupload", cbFile); 
    Log.i("SendLargeFile", "file length = " + file.length()); 
    try { 
    mpEntity.addPart("name", new StringBody(name)); 
    mpEntity.addPart("email", new StringBody(email));; 
    } catch (UnsupportedEncodingException e1) { 
    // TODO Auto-generated catch block 
    Log.e(LOG_TAG, "UnsupportedEncodingException"); 
    e1.printStackTrace(); 
    } 
    httppost.setEntity(mpEntity); 
    Log.e(LOG_TAG, "executing request " + httppost.getRequestLine()); 
    HttpResponse response; 
    try { 
    Log.e(LOG_TAG, "about to execute"); 
    response = httpclient.execute(httppost); 
    Log.e(LOG_TAG, "executed"); 
    HttpEntity resEntity = response.getEntity(); 
    Log.e(LOG_TAG, response.getStatusLine().toString()); 
    if (resEntity != null) { 
    System.out.println(EntityUtils.toString(resEntity)); 
    } 
    if (resEntity != null) { 
    resEntity.consumeContent(); 
    } 
    } catch (ClientProtocolException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
} 
+0

請看一看這個以前回答問題 http://stackoverflow.com/questions/2017414/post-multipart-request-with-android-sdk – Omie 2012-09-30 10:48:28

回答

0

我有同樣的問題帶有MultipartEntity請求。我需要將圖像上傳到服務器。 所以我通過HttpURLConnection類做了MultipartEntity請求。 我把我的代碼放在這裏,認爲它可以對你有用。 您需要設置URL路徑和文件路徑。對於這種使用方法。

public class UploadImage 
implements Runnable{ 

private static String delimiter = "--"; 
private static String boundary = "SwA" + Long.toString(System.currentTimeMillis()) + "SwA"; 
private static int bytesRead; 
private static int bytesAvailable; 
private static int bufferSize; 
private static byte[] buffer; 
private static int maxBufferSize = 1 * 1024 * 1024; 

private String URL; 
private String file; 


@Override 
public void run() 
{ 
    HttpURLConnection conn = null; 
    String response = null; 
    try { 

     URL url = new URL(URL); 
     conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoOutput(true); 
     conn.setDoInput(true); 
     conn.setUseCaches(false); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Connection", "Keep-Alive"); 
     conn.setRequestProperty("Content-type", "multipart/form-data; boundary=" + boundary); 
     conn.setRequestProperty("USER-AUTH", UserPreferences.getToken()); 
     conn.connect(); 
     // 

     DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 
     dos.writeBytes((delimiter + boundary + "\r\n")); 
     dos.writeBytes("Content-Disposition: form-data; name=\"" + "image" + "\"; filename=\"" + file + "\"\r\n"); 
     dos.writeBytes("Content-Type: mimetype\r\n");// Content-Type: 
                // text/plain 
     dos.writeBytes("Content-Transfer-Encoding: binary\r\n\r\n"); 


     // create a buffer of maximum size 
     FileInputStream fileInputStream = new FileInputStream(new File(file)); 
     bytesAvailable = fileInputStream.available(); 
     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     buffer = new byte[bufferSize]; 
     // read file and write it into form... 
     bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     while (bytesRead > 0) { 
      dos.write(buffer, 0, bufferSize); 

      bytesAvailable = fileInputStream.available(); 
      bufferSize = Math.min(bytesAvailable, maxBufferSize); 
      bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
     } 

     dos.writeBytes("\r\n"); 
     dos.writeBytes(delimiter + boundary + delimiter + "\r\n"); 
     fileInputStream.close(); 
     dos.flush(); 
     dos.close(); 
     int responseCode = conn.getResponseCode(); 

     if (responseCode != 200) { 
      throw new Exception(String.format("Received the response code %d from the URL %s", responseCode, url)); 
     } 

     InputStream is = conn.getInputStream(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] bytes = new byte[1024]; 
     int bytesRead; 
     while ((bytesRead = is.read(bytes)) != -1) { 
      baos.write(bytes, 0, bytesRead); 
     } 
     byte[] bytesReceived = baos.toByteArray(); 
     baos.close(); 

     is.close(); 
     response = new String(bytesReceived); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (conn != null) { 
      conn.disconnect(); 
     } 
    } 
} 

public void put(String targetURL, String file) 
{ 
    this.URL = targetURL; 
    this.file = file; 
}}