2012-06-22 13 views
7

Şu anki projenin belirli bir parçasında sorun yaşıyorum ve şu anda sıkışmış gibi hissediyorum. Bir HTTP yayını ve çok parçalı form verileriyle video yüklemeyi deniyorum. HTTP protokolünü ve özellikle de çok parçalı form verilerini anlamada bir duvara çarptığımı hissediyorum.Android videoyu HTTP çoktan yürütme verilerini kullanarak uzak sunucuya yükleyin

Video yüklemek için http://videoupload.thecompany.com/VideoApp.xml?method=upload&objectType=person&objectId=777777 biçiminde bir URL var. Ayrıca bir başlık, açıklama ve elbette video dosyası eklemem gerekiyor. Bunlar "multipart data" mı?

benim ihtiyaçlarını Upload video from Android to server? karşılamak için bu çözümü adapte çalıştı ve şu ek verileri ayar onca böylece gibi diğer conn.setRequestProperty() çağırır: Ama bu benim için çalışmıyor

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

. Kodun orijinal yazarı tarafından 30 satır sonra çok satırlı form verisi eklemek için bir yorum var, ama nedenini anlamıyorum. Herhangi bir yardım için teşekkürler.

cevap

19

Büyük ölçüde bilgi ve bağlantılardan here bulunan bulduğum iki adım çözüm İşte. Bu çözüm, bazı ilgili SO gönderilerinde upload2server() yönteminden daha iyi kavramak için daha kolaydı. Umarım bu bir başkasına yardım eder.

1) Galeriden video dosyasını seçin.

Bir değişken oluşturun private static final int SELECT_VIDEO = 3; - hangi numarayı kullandığınız önemli değil, daha sonra denetleyeceğinize kadar. Ardından, bir video seçmek için bir niyet kullanın.

UploadVideo() yöntemini başlatmak için onActivityResult() öğesini kullanın. Eğer sizi çalışma sonra muhtemelen edeceğiz

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() 

:

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) projenize ekleyin son HttpClient kavanoz indirmek, http://hc.apache.org/downloads.cgi gidin ve aşağıdaki yöntemi kullanarak video yükleyebilir Bir iş parçacığı içine koymak ve bir yükleme iletişim kutusu eklemek istiyorum, ancak bu başlamanızı sağlayacaktır. Upload2Server() yöntemini başarısız bir şekilde denedikten sonra benim için çalışıyor. Bu, bazı küçük ayarlarda görüntü ve ses için de çalışacaktır.

+0

Çok güzel! Bu büyük boy video için kullanılabilir mi? Ya da başka bir dosya türü için kullanılabilir mi? –

+1

@AliBagheriShakib daha büyük videolar için iyi çalışmalı. Evet, ses klipleri veya diğer dosya türleri için çok benzer şekilde kullanılabilir. Eğer herhangi bir sorun varsa bana bildirin. –

+1

Evet @Kyle Clegg. Benim için mükemmel çalıştı. Sorunlarım kardeşim çözüldü :) Kendi deneyimlerimi de gönderiyorum: http://stackoverflow.com/q/23504191/2624611 –

İlgili konular