使用HttpClient上传视频文件 [英] Upload Video file using HttpClient

查看:344
本文介绍了使用HttpClient上传视频文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建Java客户端,它将自动将文件从Java服务器上传到我使用AMI安装在EC2云上的Panda实例。我正尝试使用 Apache HTTP组件上传到Panda Server( 熊猫流)。它与我的浏览器客户端正常工作,但由于某种原因,我无法从该库上传。这是我的代码:

  String videoUploadUrl =http:// [panda server ip] / videos /+ getVideoID +/upload.xml; 
档案档案=新档案(/ temp / videofile.mp4);

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getParams()。setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1);

HttpPost httppost = new HttpPost(videoUploadUrl);

MultipartEntity mpEntity = new MultipartEntity();

ContentBody fBody = new FileBody(file);

mpEntity.addPart(userfile,fBody);

httppost.setEntity(mpEntity);


System.out.println(执行请求+ httppost.getRequestLine());
HttpResponse response2 = httpclient.execute(httppost); //< - FAILS HERE
System.out.println(finish execution request);

HttpEntity resEntity = response2.getEntity();

System.out.println(response2.getStatusLine());
if(resEntity!= null){
System.out.println(EntityUtils.toString(resEntity));

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

httpclient.getConnectionManager()。shutdown();

这里是我的错误日志。

 执行请求POST http:// [panda server ip] /videos/0fbd7300-b7b2-012d-7c3f9-1223456a654/upload.xml HTTP / 1.1方法:POST 
Oct 11 ,2010 3:09:25 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
INFO:I / O异常(java.net.SocketException)在处理请求时被捕获:Broken pipe
Oct 11 ,2010 3:09:25 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
INFO:重试请求
Oct 11,2010 3:09:55 PM org.apache.http.impl。 client.DefaultRequestDirector tryExecute
INFO:I / O异常(java.net.SocketException)在处理请求时被捕获:Broken pipe
Oct 11,2010 3:09:55 PM org.apache.http.impl。 client.DefaultRequestDirector tryExecute
INFO:重试请求
线程main中的异常java.net.SocketException:在java.net.SocketOutputStream.socketWrite0中断开的
(本地方法)
在java.net.SocketOut putStream.socketWrite(SocketOutputStream.java:92)
在java.net.SocketOutputStream.write(SocketOutputStream.java:136)
在org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer。 java:124)
at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:114)
at org.apache.http.entity.mime.content.FileBody.writeTo( FileBody.java:105)
at org.apache.http.entity.mime.HttpMultipart.doWriteTo(HttpMultipart.java:173)
at org.apache.http.entity.mime.HttpMultipart.writeTo( HttpMultipart.java:191)
at org.apache.http.entity.mime.MultipartEntity.writeTo(MultipartEntity.java:169)
at org.apache.http.impl.entity.EntitySerializer.serialize( EntitySerializer.java:120)在org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:253

在org.apache.http.impl.conn.AbstractClientConnAdapte r.sendRequestEntity(AbstractClientConnAdapter.java:227)
在org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:248)
在org.apache.http.protocol.HttpRequestExecutor.execute( HttpRequestExecutor.java:123)在org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:623
)在org.apache.http.impl.client.DefaultRequestDirector.execute
( DefaultRequestDirector.java:455)美元,org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:694 b $ b)
在org.apache.http.impl.client.AbstractHttpClient.execute( AbstractHttpClient.java:625)美元,org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:603 b $ b)
在testmainjava.FileUpload.main(FileUpload.java:57)

我错过了什么?为什么我要弄坏管子如果我使用相同的代码上传到一些servlet,那么我工作正常,但不与熊猫实例。
任何想法?

解决方案

为了简化您的疑难解答,了解正在发生的事情: b
$ b


  • 打开 HttpClient连线级别 LiveHttpHeaders
  • 或类似的插件来查找浏览器如何处理这个
  • 使用WireShark或类似工具来检查网络级流量然后,比较浏览器和HttpClient之间的差异


我注意到一件事:在你的代码中,你将视频发布为userfile参数,但是 PandaStream API文档说,你应该使用文件参数。即使参数名称错误,PandaStream仍然应该返回一个正确的响应,而不仅仅是在错误的情况下关闭连接。

最后,您是否配置PandaStream向您发送错误消息?如果没有,这可能会有所帮助,如果遇到一些错误(请参阅入门指南 )。


I'm building Java client that will automatically upload file from Java server to Panda Instance that I installed on my EC2 cloud using their AMI. I'm trying to use Apache HTTP Components to upload to Panda Server (Panda Stream). It works fine with my browser client but for some reason I can't upload from that library. Here is my code:

String videoUploadUrl = "http://[panda server ip]/videos/" + getVideoID() + "/upload.xml";
File file = new File("/temp/videofile.mp4");

DefaultHttpClient httpclient = new DefaultHttpClient();
httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

HttpPost httppost = new HttpPost(videoUploadUrl);

MultipartEntity mpEntity = new MultipartEntity();

ContentBody fBody = new FileBody(file);

mpEntity.addPart("userfile", fBody);

httppost.setEntity(mpEntity);


System.out.println("executing request " + httppost.getRequestLine());
HttpResponse response2 = httpclient.execute(httppost); // <-- FAILS HERE
System.out.println("finish executing request");

HttpEntity resEntity = response2.getEntity();

System.out.println(response2.getStatusLine());
if (resEntity != null) {
    System.out.println(EntityUtils.toString(resEntity));
}
if (resEntity != null) {
    resEntity.consumeContent();
}

httpclient.getConnectionManager().shutdown();

And here is my error log.

executing request POST http://[panda server ip]/videos/0fbd7300-b7b2-012d-7c3f9-1223456a654/upload.xml HTTP/1.1 Method: POST
Oct 11, 2010 3:09:25 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: I/O exception (java.net.SocketException) caught when processing request: Broken pipe
Oct 11, 2010 3:09:25 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: Retrying request
Oct 11, 2010 3:09:55 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: I/O exception (java.net.SocketException) caught when processing request: Broken pipe
Oct 11, 2010 3:09:55 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: Retrying request
Exception in thread "main" java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at org.apache.http.impl.io.AbstractSessionOutputBuffer.write(AbstractSessionOutputBuffer.java:124)
        at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:114)
        at org.apache.http.entity.mime.content.FileBody.writeTo(FileBody.java:105)
        at org.apache.http.entity.mime.HttpMultipart.doWriteTo(HttpMultipart.java:173)
        at org.apache.http.entity.mime.HttpMultipart.writeTo(HttpMultipart.java:191)
        at org.apache.http.entity.mime.MultipartEntity.writeTo(MultipartEntity.java:169)
        at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:120)
        at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:253)
        at org.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:227)
        at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:248)
        at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
        at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:623)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:455)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:694)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:625)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:603)
        at testmainjava.FileUpload.main(FileUpload.java:57)

What am I missing? Why I'm getting broken pipe. If I use same code to upload to some servlet then I work fine but not with panda Instance. Any idea?

解决方案

In order to ease your troubleshooting and find out what is happening:

  • turn on HttpClient wire level logging
  • use LiveHttpHeaders or similar plugin to find out how the browser is handling this
  • use WireShark or similar tool for checking the network level traffic

Then, compare the differences between browser and HttpClient.

One thing I noticed: in your code, you are posting the video as "userfile" parameter, but PandaStream API documentation says that you should use "file" parameter. Not sure if it makes a difference, though.

Even if the parameter name is wrong, PandaStream should still return a proper response, not just close the connection in case of error.

Finally, did you configure PandaStream to send you the error messages? If not, this could help, if it is encountering some errors (see the getting started guide for that).

这篇关于使用HttpClient上传视频文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆