码迷,mamicode.com
首页 > 编程语言 > 详细

HTTP文件下载JAVA后台的实现

时间:2017-07-26 13:47:21      阅读:342      评论:0      收藏:0      [点我收藏+]

标签:display   ==   down   方式   content   windows   系统   stat   time()   

HTTP文件的下载后台JAVA代码

1、使用org.apache.http.impl.client.CloseableHttpClient

先上代码:

    public String downloadFile(String src_file, String dest_file) throws Throwable {

        String fileName = getFileName(src_file);
        try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
                    HttpGet httpget = new HttpGet(src_file);
                    httpget.setConfig(RequestConfig.custom() //
                            .setConnectionRequestTimeout(downloadTimeout) //
                            .setConnectTimeout(downloadTimeout) //
                            .setSocketTimeout(downloadTimeout) //
                            .build());
                    try (CloseableHttpResponse response = httpclient.execute(httpget)) {
                        org.apache.http.HttpEntity entity = response.getEntity();
                        File desc = new File(dest_file+File.separator+fileName);
                        File folder = desc.getParentFile();
                        folder.mkdirs();
                        try (InputStream is = entity.getContent(); //
                                OutputStream os = new FileOutputStream(desc)) {
                            StreamUtils.copy(is, os);
                        }
                    }catch(Throwable e){
                        throw new Throwable("文件下载失败......", e);
                    }
                }
            return dest_file+File.separator+fileName;
        }

另外:添加header代码如下:httpget.addHeader("X-Auth-Token",token); 

2、使用curl:

   windows系统中使用需要下载CURL,下载地址:https://curl.haxx.se/download.html 选择windows版;

技术分享

使用命令行下载文件java代码:

package com.test.download;

import java.io.IOException;

public class TestDownload {

    public static void main(String[] args) {
        
        String curlPath = "D:\\curl\\I386\\CURL.EXE";
        String destPath = "D:\\2.jpg";
        String fileUrl = "http://i0.hdslb.com/bfs/archive/5a08e413f479508ab78bb562ac81f40ad28a4245.jpg";
        dowloadFile(curlPath,destPath,fileUrl);
        
    }

    private static void dowloadFile(String curlPath ,String filePath, String url) {
        
        long start = System.currentTimeMillis();
        String token = "12345678901234567890";
        System.out.println("执行命令==="+curlPath + " -o "+ filePath +" \"" + url +"\""
                + " -H \"X-Auth-Token:"+token+"\" -X GET");
        try {
            Runtime.getRuntime().exec(curlPath + " -o "+ filePath +" \"" + url +"\""
                    + " -H \"X-Auth-Token:"+token+"\" -X GET");
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("下载成功,耗时(ms):"+(System.currentTimeMillis()-start));
        
    }
    
}

具体的CURL命令行使用可以看帮助:curl -h

3、Servlet文件下载:

技术分享
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
        int bytesum = 0;
        int byteread = 0;

        URL url = new URL("http://img.baidu.com/logo.gif");

        try {
            URLConnection conn = url.openConnection();
            InputStream inStream = conn.getInputStream();
            FileOutputStream fs = new FileOutputStream("c:/abc.gif");

            byte[] buffer = new byte[1204];
            int length;
            while ((byteread = inStream.read(buffer)) != -1) {
                bytesum += byteread;
                System.out.println(bytesum);
                fs.write(buffer, 0, byteread);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void downLoad(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
        File f = new File(filePath);
        if (!f.exists()) {
            response.sendError(404, "File not found!");
            return;
        }
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
        byte[] buf = new byte[1024];
        int len = 0;

        response.reset(); // 非常重要
        if (isOnLine) { // 在线打开方式
            URL u = new URL("file:///" + filePath);
            response.setContentType(u.openConnection().getContentType());
            response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
            // 文件名应该编码成UTF-8
        } else { // 纯下载方式
            response.setContentType("application/x-msdownload");
            response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
        }
        OutputStream out = response.getOutputStream();
        while ((len = br.read(buf)) > 0)
            out.write(buf, 0, len);
        br.close();
        out.close();
    }
download

4、添加两个文件复制的代码:

private static void nioTransferCopy(File source, File target) {  
    FileChannel in = null;  
    FileChannel out = null;  
    FileInputStream inStream = null;  
    FileOutputStream outStream = null;  
    try {  
        inStream = new FileInputStream(source);  
        outStream = new FileOutputStream(target);  
        in = inStream.getChannel();  
        out = outStream.getChannel();  
        in.transferTo(0, in.size(), out);  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        close(inStream);  
        close(in);  
        close(outStream);  
        close(out);  
    }  
}  


private static void nioBufferCopy(File source, File target) {  
    FileChannel in = null;  
    FileChannel out = null;  
    FileInputStream inStream = null;  
    FileOutputStream outStream = null;  
    try {  
        inStream = new FileInputStream(source);  
        outStream = new FileOutputStream(target);  
        in = inStream.getChannel();  
        out = outStream.getChannel();  
        ByteBuffer buffer = ByteBuffer.allocate(4096);  
        while (in.read(buffer) != -1) {  
            buffer.flip();  
            out.write(buffer);  
            buffer.clear();  
        }  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        close(inStream);  
        close(in);  
        close(outStream);  
        close(out);  
    }  
}  

 

HTTP文件下载JAVA后台的实现

标签:display   ==   down   方式   content   windows   系统   stat   time()   

原文地址:http://www.cnblogs.com/liangblog/p/7237750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!