怎么使用httpclient发送大文件(1G以上)
澳门银河官网
澳门银河官网
当前位置 : 澳门银河官网 > 澳门银河官网网址

怎么使用httpclient发送大文件(1G以上)

怎么使用httpclient中的put方法上传大文件?
如果是一次性读到内存中发送的话,内存很容易撑爆,所以肯定是用边读边发的方式,或者使用分片上传。现在想知道怎么使用httpclient实现边读边传,使用jdk自带的方法已经知道怎么实现了。

    public static void putRequestString uri, Map<String, String> headers, File file
    {
        URLConnection urlconnection = null;
        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;
        
        try
        {
            URL url = new URLuri;
            urlconnection = url.openConnection;
            urlconnection.setDoOutputtrue;
            urlconnection.setDoInputtrue;

            if urlconnection instanceof HttpURLConnection
            {
                try
                {
                    HttpURLConnection urlconnection.setRequestMethod"PUT";
                    forMap.Entry<String, String> entry : headers.entrySet
                    {
                        HttpURLConnection urlconnection.setRequestPropertyentry.getKey, entry.getValue;
                    }
                    HttpURLConnection urlconnection.connect;

                }
                catch ProtocolException e
                {
                    e.printStackTrace;
                }
            }

            bos = new BufferedOutputStreamurlconnection.getOutputStream;
            bis = new BufferedInputStreamnew FileInputStreamfile;
            
            byte[] buff = new byte[1024 * 8];
            int i;
            while i = bis.readbuff != -1
            {
                bos.writebuff, 0, i;
            }
            System.out.printlnHttpURLConnection urlconnection.getResponseMessage;
        }
        catch Exception e
        {
            e.printStackTrace;
        }
        finally
        {
            IOUtils.closeQuietlybis;
            IOUtils.closeQuietlybos;
            HttpURLConnection urlconnection.disconnect;
        }
    }

已经知道怎么传输了,关键是实现HttpEntity中的writeTo方法,httpclient中已经有了相关实现具体可以参考:

http://hc.apache.org/httpcomp...

    public void writeTofinal OutputStream outstream throws IOException {
        Args.notNulloutstream, "Output stream";
        final InputStream instream = new FileInputStreamthis.file;
        try {
            final byte[] tmp = new byte[OUTPUT_BUFFER_SIZE];
            int l;
            while l = instream.readtmp != -1 {
                outstream.writetmp, 0, l;
            }
            outstream.flush;
        } finally {
            instream.close;
        }
    }

另外,这个FileEntity的实现用的是普通的IO方式,搜索可以知道,httpcore这个包已经实现了NFileEntity,采用的是FileChannel方式,会更高效

可以用流的方式

非要用http协议吗

1G的大小就已经不建议通过http的方式来处理了。
ftp吧。

广告位

澳门银河官网