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

查看:707
本文介绍了java - 怎么使用httpclient发送大文件(1G以上)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

怎么使用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();
        }
    }

解决方案

已经知道怎么传输了,关键是实现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方式,会更高效

这篇关于java - 怎么使用httpclient发送大文件(1G以上)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆