2012-06-22 7 views
7

Ho problemi su un determinato pezzo di un progetto corrente e mi sento come se fossi bloccato in questo momento. Sto cercando di caricare un video con un post HTTP e dati di moduli multipart. Mi sento come se fossi colpito da un muro per comprendere il protocollo HTTP e in particolare i dati dei moduli multipart.Carica video Android sul server remoto utilizzando i dati del modulo multipart HTTP

Ho un URL per caricare video nel formato http://videoupload.thecompany.com/VideoApp.xml?method=upload&objectType=person&objectId=777777. Devo anche includere un titolo, una descrizione e il video file, naturalmente. Sono questi i "dati multipart"?

ho provato adattare questa soluzione per soddisfare le mie esigenze Upload video from Android to server?, e impostando i dati aggiuntivi seguenti tutti gli altri conn.setRequestProperty() chiama in questo modo:

conn.setRequestProperty("title", "video title"); 
conn.setRequestProperty("description", "video description"); 

Ma questo non sta lavorando per me . C'è un commento dall'autore originale del codice per aggiungere dati di moduli multipart circa 30 righe dopo, ma non capisco perché. Grazie per qualsiasi aiuto.

risposta

19

Ecco la soluzione in due passaggi che ho trovato, in gran parte dalle informazioni e collegamenti trovati here. Questa soluzione mi è stata più facile da capire rispetto al metodo upload2server() in alcuni dei post SO relativi. Spero che questo aiuti qualcun altro.

1) Selezionare il file video dalla galleria.

Creare una variabile private static final int SELECT_VIDEO = 3; - non importa quale numero si utilizza, a patto che sia quello a cui si controlla in seguito. Quindi, utilizzare un intento per selezionare un video.

Intent intent = new Intent(); 
intent.setType("video/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent,"Select a Video "), SELECT_VIDEO); 

Usa onActivityResult() per avviare il metodo uploadVideo().

public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (resultCode == RESULT_OK) { 

     if (requestCode == SELECT_VIDEO) { 
      System.out.println("SELECT_VIDEO"); 
      Uri selectedVideoUri = data.getData(); 
      selectedPath = getPath(selectedVideoUri); 
      System.out.println("SELECT_VIDEO Path : " + selectedPath); 

      uploadVideo(selectedPath); 
     }  
    } 
} 

private String getPath(Uri uri) { 
    String[] projection = { MediaStore.Video.Media.DATA, MediaStore.Video.Media.SIZE, MediaStore.Video.Media.DURATION}; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    cursor.moveToFirst(); 
    String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)); 
    int fileSize = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)); 
    long duration = TimeUnit.MILLISECONDS.toSeconds(cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION))); 


    //some extra potentially useful data to help with filtering if necessary 
    System.out.println("size: " + fileSize); 
    System.out.println("path: " + filePath); 
    System.out.println("duration: " + duration); 

    return filePath; 
} 

2) Vai http://hc.apache.org/downloads.cgi, scaricare l'ultimo barattolo HttpClient, aggiungerlo al progetto, e caricare il video utilizzando il seguente metodo:

private void uploadVideo(String videoPath) throws ParseException, IOException { 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(YOUR_URL); 

    FileBody filebodyVideo = new FileBody(new File(videoPath)); 
    StringBody title = new StringBody("Filename: " + videoPath); 
    StringBody description = new StringBody("This is a description of the video"); 

    MultipartEntity reqEntity = new MultipartEntity(); 
    reqEntity.addPart("videoFile", filebodyVideo); 
    reqEntity.addPart("title", title); 
    reqEntity.addPart("description", description); 
    httppost.setEntity(reqEntity); 

    // DEBUG 
    System.out.println("executing request " + httppost.getRequestLine()); 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity resEntity = response.getEntity(); 

    // DEBUG 
    System.out.println(response.getStatusLine()); 
    if (resEntity != null) { 
     System.out.println(EntityUtils.toString(resEntity)); 
    } // end if 

    if (resEntity != null) { 
     resEntity.consumeContent(); 
    } // end if 

    httpclient.getConnectionManager().shutdown(); 
} // end of uploadVideo() 

Una volta che si lavora probabilmente vuoi metterlo in una discussione e aggiungere una finestra di caricamento, ma questo ti farà iniziare. Lavorando per me dopo aver provato senza successo il metodo upload2Server(). Questo funzionerà anche per immagini e audio con qualche piccola modifica.

+0

Così bello! È utilizzabile per video di grandi dimensioni? Oppure può essere utilizzato per altri tipi di file? –

+1

@AliBagheriShakib dovrebbe funzionare bene per i video più grandi. Sì, può essere usato per clip audio o altri tipi di file in modo molto simile. Fammi sapere se hai problemi. –

+1

Sì @Kyle Clegg. Ha funzionato perfettamente per me. I miei problemi risolti bro :) Pubblico anche la mia esperienza: http://stackoverflow.com/q/23504191/2624611 –

Problemi correlati