Android使用HTTP多部分表单数据将video上传到远程服务器

我在当前项目的某个部分遇到麻烦,现在感觉我被卡住了。 我正在尝试使用HTTPpost和多部分表单数据进行video上传。 我觉得我在理解HTTP协议,尤其是多部分表单数据方面遇到了困难。

我有一个url上传video格式为http://videoupload.thecompany.com/VideoApp.xml?method=upload&objectType=person&objectId=777777 。 当然,我还需要包含一个标题,描述和videoFile。 这些是“多部分数据”吗?

我试过适应这个解决scheme来满足我的需求从Android上传video到服务器? ,并设置所有其他conn.setRequestProperty()调用之后的额外数据,如下所示:

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

但这不适合我。 代码的原始作者有一个评论,以后添加约30行的多部分forms的数据,但我不明白为什么。 谢谢你的帮助。

Solutions Collecting From Web of "Android使用HTTP多部分表单数据将video上传到远程服务器"

以下是我提出的两步解决scheme,主要来自这里find的信息和链接。 在一些相关的SOpost中,这个解决scheme比upload2server()方法更容易理解。 希望这可以帮助别人。

1)从图库中selectvideo文件。

创build一个variablesprivate static final int SELECT_VIDEO = 3; – 不pipe你使用什么号码,只要这是你以后检查的号码。 然后,使用意图select一个video。

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

使用onActivityResult()来启动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)转到http://hc.apache.org/downloads.cgi ,下载最新的HttpClient jar,将其添加到您的项目,并使用以下方法上传video:

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

一旦你有它的工作,你可能会想把它放在一个线程,并添加一个上传对话框,但这会让你开始。 在我尝试upload2Server()方法失败之后为我工作。 这也将适用于图像和audio稍微调整。