Загрузить видео файл с помощью HttpClient

Я создаю Java-клиент, который автоматически загружает файл с Java-сервера в Panda Instance, который я установил в своем облаке EC2, используя их AMI. Я пытаюсь использовать Apache HTTP Components для загрузки на сервер Panda ( Panda Stream). Он отлично работает с моим клиентом браузера, но по какой-то причине я не могу загрузить из этой библиотеки. Вот мой код:

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

И вот мой журнал ошибок.

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)

Что мне не хватает? Почему я получаю сломанную трубу. Если я использую тот же код для загрузки в какой-нибудь сервлет, тогда я работаю нормально, но не с Panda Instance. Любая идея?

3 ответа

Решение

Чтобы облегчить устранение неполадок и выяснить, что происходит:

  • включить протоколирование уровня проводов HttpClient
  • используйте LiveHttpHeaders или аналогичный плагин, чтобы узнать, как браузер обрабатывает это
  • используйте WireShark или аналогичный инструмент для проверкитрафика на уровне сети

Затемсравните различия между браузером и HttpClient.

Я заметил одну вещь: в своем коде вы публикуете видео как параметр "userfile", но в документации PandaStream API сказано, что вы должны использовать параметр "file". Не уверен, если это имеет значение, хотя.

Даже если имя параметра неверно, PandaStream все равно должен вернуть правильный ответ, а не просто закрыть соединение в случае ошибки.

Наконец, вы настроили PandaStream для отправки вам сообщений об ошибках? Если нет, это может помочь, если он сталкивается с некоторыми ошибками (см. Руководство по началу работы для этого).

Я посмотрел на этот вопрос, пытаясь найти решение для загрузки в pandastream из Java. Не удалось найти библиотеку с этой функциональностью, поэтому обновил panda-lib для этого.

https://github.com/maxhille/panda-lib

Привет, я Вивьен, технический директор компании pandastream. Я начал делать Java-клиент, но у меня не было времени закончить его. если хочешь раскошелиться, будь свободен.

https://github.com/vivienschilis/panda_client_java

Другие вопросы по тегам