>  Q&A  >  본문

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();
        }
    }
ringa_leeringa_lee2744일 전635

모든 응답(4)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-18 10:50:54

    전송 방법을 이미 알고 있습니다. 핵심은 HttpEntity에 writeTo 메서드를 구현하는 것입니다. 자세한 내용은 다음을 참조하세요.

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

    으아악
    또한 이 FileEntity의 구현은 일반 IO 메서드를 사용하여 검색하면 httpcore 패키지가 NFileEntity를 구현하고 FileChannel 메서드를 사용한다는 것을 알 수 있어 더 효율적입니다

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:50:54

    스트리밍을 이용할 수 있습니다

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:50:54

    http 프로토콜을 사용해야 하나요?

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:50:54

    1G 크기로 인해 더 이상 http를 통해 처리하는 것을 권장하지 않습니다.
    ftp로 보내세요.

    회신하다
    0
  • 취소회신하다