2010-04-09 8 views
5

Mi piacerebbe costruire una richiesta multipart con i seguenti parametri: nome (stringa), email (stringa) e fileupload (file). Sto usando il codice Java qui sotto (funziona su Android).Aiutare a costruire una richiesta POST con MultipartEntity (domanda newbie)

Il httppost.getRequestLine() stampa

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

Quindi tutto sembra buono sul sito del cliente, ma il mio server (Django/Apache) legge come una richiesta GET, senza parametri GET - request.method produce ' GET ', request.GET.items() produce un dizionario vuoto.

Cosa sto sbagliando? Non so in realtà come impostare correttamente i parametri multipart - sto usando congetture - quindi è possibile che questo sia il problema.

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

Si prega di dare un'occhiata a questa domanda in precedenza risposto http://stackoverflow.com/questions/2017414/post-multipart-request-with-android-sdk – Omie

risposta

0

ho avuto lo stesso problema con richiesta MultipartEntity. Avevo bisogno di caricare l'immagine sul server. Così ho fatto richiesta MultipartEntity dalla classe HttpURLConnection. Metto qui il mio codice, penso che possa esserti utile. È necessario impostare il percorso dell'URL e il percorso del file. Per questo usa il metodo put.

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; 
}} 
Problemi correlati