使用Java中的PUT请求上载文件,并执行上载进度
我正在尝试做一些非常简单的事情,但到目前为止,我还没有成功地尝试各种方法来实现它。我尝试过使用一个简单的使用Java中的PUT请求上载文件,并执行上载进度,java,http,http-put,Java,Http,Http Put,我正在尝试做一些非常简单的事情,但到目前为止,我还没有成功地尝试各种方法来实现它。我尝试过使用一个简单的java.io.Socket、一个java.io.HttpURLConnection、一个org.apache.commons.httpclient.httpclient上传到URL,但每次都失败了 我需要提出这样的请求: PUT http://1.2.3.4:8080/upload?ticket_id=abcdef124567890 HTTP/1.1 Host: 1.2.3.4:8080 C
java.io.Socket
、一个java.io.HttpURLConnection
、一个org.apache.commons.httpclient.httpclient
上传到URL,但每次都失败了
我需要提出这样的请求:
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
)写入主请求体,其中包含视频字节
我基本上有两个要求:
编辑 下面是我尝试使用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:breaked pipe
异常。对于1,您需要使用。被引用的帖子对此进行了描述。对于2,在发送数据时使用一些包装器。计数流可能需要挂接在HttpClient内部
如果您添加更多不适合您的细节,可以提供更多详细信息。好的,更新了我的问题。即使服务器希望直接从请求体读取,我是否仍然需要PUT请求中的多部分请求?管道中断异常,可能意味着服务器关闭了连接。它可能是因为检测到某个字节序列或其他原因才这样做的。多部分协议确保二进制数据正确通过,但显然您必须以服务器可以理解的格式发送数据。你控制服务器代码吗?不,它是一个协议,并根据该协议接受东西。我正在按照指示操作,但由于某种原因失败了。可能是他们检测到文件有问题。我似乎对你的客户没有问题。我会联系他们的支持(或在他们的支持论坛上发布)。