怎么使用httpclient中的put方法上传大文件?
如果是一次性读到内存中发送的话,内存很容易撑爆,所以肯定是用边读边发的方式,或者使用分片上传。现在想知道怎么使用httpclient实现边读边传,使用jdk自带的方法已经知道怎么实现了。
public static void putRequest(String uri, Map<String, String> headers, File file)
{
URLConnection urlconnection = null;
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try
{
URL url = new URL(uri);
urlconnection = url.openConnection();
urlconnection.setDoOutput(true);
urlconnection.setDoInput(true);
if (urlconnection instanceof HttpURLConnection)
{
try
{
((HttpURLConnection) urlconnection).setRequestMethod("PUT");
for(Map.Entry<String, String> entry : headers.entrySet())
{
((HttpURLConnection) urlconnection).setRequestProperty(entry.getKey(), entry.getValue());
}
((HttpURLConnection) urlconnection).connect();
}
catch (ProtocolException e)
{
e.printStackTrace();
}
}
bos = new BufferedOutputStream(urlconnection.getOutputStream());
bis = new BufferedInputStream(new FileInputStream(file));
byte[] buff = new byte[1024 * 8];
int i;
while ((i = bis.read(buff)) != -1)
{
bos.write(buff, 0, i);
}
System.out.println(((HttpURLConnection) urlconnection).getResponseMessage());
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
IOUtils.closeQuietly(bis);
IOUtils.closeQuietly(bos);
((HttpURLConnection) urlconnection).disconnect();
}
}
大家讲道理2017-04-18 10:50:54
已經知道怎麼傳輸了,關鍵是實現HttpEntity中的writeTo方法,httpclient中已經有了相關實作具體可以參考:
http://hc.apache.org/httpcomp...
public void writeTo(final OutputStream outstream) throws IOException {
Args.notNull(outstream, "Output stream");
final InputStream instream = new FileInputStream(this.file);
try {
final byte[] tmp = new byte[OUTPUT_BUFFER_SIZE];
int l;
while ((l = instream.read(tmp)) != -1) {
outstream.write(tmp, 0, l);
}
outstream.flush();
} finally {
instream.close();
}
}
另外,這個FileEntity的實作用的是普通的IO方式,搜尋可以知道,httpcore這個套件已經實現了NFileEntity,採用的是FileChannel方式,會更有效率