私は本当に簡単なことをしようとしていますが、これまでのところ、それを実現するためのさまざまな方法を試すことに失敗しています。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つの要件があります。
- PUTリクエストを使用してファイルを特定のサーバーにアップロードする必要があります。
- アップロードの進行状況を監視できる必要があります。
これを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
ます。