1. 程式人生 > >HTTP文件下載JAVA後臺的實現

HTTP文件下載JAVA後臺的實現

打開方式 url ack sts client length code filepath download

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後臺的實現