0

私は本当に簡単なことをしようとしていますが、これまでのところ、それを実現するためのさまざまな方法を試すことに失敗しています。java.io.Socket単純な、を使用してjava.io.HttpURLConnection、最後にを使用してURLにアップロードしようとしましたorg.apache.commons.httpclient.HttpClientが、毎回それを実現できませんでした。

私はこのような要求をする必要があります:

PUT http://1.2.3.4:8080/upload?ticket_id=abcdef124567890 HTTP/1.1
Host: 1.2.3.4:8080
Content-Length: 339108
Content-Type: video/mp4

\0abc\32af ... etc.

ビデオバイトを含むファイルのバイト(おそらくからFileInputStream)をメインのリクエスト本文に書き込む必要があります。

基本的に2つの要件があります。

  1. PUTリクエストを使用してファイルを特定のサーバーにアップロードする必要があります。
  2. アップロードの進行状況を監視できる必要があります。

これをJavaで実現するにはどうすればよいですか?


編集

これがApacheを使用してこれを行うための私の試みHttpClientです:

HttpClient httpClient = new HttpClient();
PutMethod httpMethod = new PutMethod(ticket.getEndpoint());
httpMethod.setRequestHeader("Content-Type", "video/mp4");
httpMethod.setRequestHeader("Content-Length", String.valueOf(getStreamFile().length()));

final FileInputStream streamFileInputStream = new FileInputStream(getStreamFile());
final BufferedInputStream bufferedInputStream = new BufferedInputStream(streamFileInputStream);

httpMethod.setRequestEntity(new RequestEntity() {
    @Override public void writeRequest(OutputStream out) 
            throws IOException {
        byte[] fileBuffer = new byte[getBufferLength()];
        
        int bytesRead = 0;
        int totalBytesRead = 0;
        final int totalFileBytes = (int)getStreamFile().length();
        
        while ((bytesRead = bufferedInputStream.read(fileBuffer)) > 0) {
            out.write(fileBuffer, 0, bytesRead);
            totalBytesRead += bytesRead;
            
            notifyListenersOnProgress((double)totalBytesRead / (double)totalFileBytes);
        }
    }
    
    @Override public boolean isRepeatable() {
        return true;
    }
    
    @Override public String getContentType() {
        return "video/mp4";
    }
    
    @Override public long getContentLength() {
        return getStreamFile().length();
    }
});

final int responseCode = httpClient.executeMethod(httpMethod);

logger.debug("Server Response {}: {}", responseCode, 
        httpMethod.getResponseBodyAsString());

これは例外で失敗しjava.net.SocketException: Broken pipeます。

4

1 に答える 1

0

1の場合、マルチパートリクエストを使用する必要があります。参照された投稿はそれを説明しています。2の場合、データを送信するときにカウントストリームラッパーを使用します。カウントストリームは、HttpClient内にフックする必要がある場合があります。

うまくいかないことについてさらに詳細を追加すると、詳細を提供できます。

于 2012-07-10T23:08:18.650 に答える