java实现文件下载功能

目录

单个下载(流)

1、设置响应类型和头信息

2、实现文件输出

单个下载(本地文件)

1、文件读取

2、设置响应类型和头信息

3、实现文件输出

单个下载(网络文件)

1、与服务器建立连接

2、设置响应类型和头信息

3、实现文件输出

压缩ZIP下载

1、设置响应类型和头信息

2、创建压缩流

3、向压缩文件中输出数据

批量下载


文件下载功能已经成为现代Web应用程序不可或缺的一部分。

单个下载(流)
1、设置响应类型和头信息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

Content-Type:用于指示接收方如何处理响应数据,并告知浏览器所需下载的文件类型

attachment:用于指示浏览器以下载方式显示响应数据

filename:用于指定下载文件的文件名

2、实现文件输出
InputStream in = obsUploadUtils.downFile(url);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
    out.write(buffer, 0, len);
}
in.close();
out.close();

1.获取一个输入流,并将其用于访问服务器上的文件

2.使用ServletOutputStream类的getOutputStream()方法创建一个数据输出流,并将其用于输出文件数据

3.while循环逐个读取文件数据,并将其写入到输出流中

4.关闭输入输出流

单个下载(本地文件)
1、文件读取
InputStream in = new FileInputStream("c:/Operator.doc");

通过打开与实际文件的连接创建一个FileInputStream,传递一个String类型的文件路径

2、设置响应类型和头信息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

Content-Type:用于指示接收方如何处理响应数据,并告知浏览器所需下载的文件类型

attachment:用于指示浏览器以下载方式显示响应数据

filename:用于指定下载文件的文件名

3、实现文件输出
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
    out.write(buffer, 0, len);
}
in.close();
out.close();

1.获取一个输入流,并将其用于访问服务器上的文件

2.使用ServletOutputStream类的getOutputStream()方法创建一个数据输出流,并将其用于输出文件数据

3.while循环逐个读取文件数据,并将其写入到输出流中

4.关闭输入输出流

单个下载(网络文件)
1、与服务器建立连接
URL url = new URL(“”);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();

1.在url中输入要解析的网络文件路径

2.通过在 URL 上调用 openConnection 方法创建连接对象

3.通过getInputStream()获取对象的输入流

2、设置响应类型和头信息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

Content-Type:用于指示接收方如何处理响应数据,并告知浏览器所需下载的文件类型

attachment:用于指示浏览器以下载方式显示响应数据

filename:用于指定下载文件的文件名

3、实现文件输出
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
    out.write(buffer, 0, len);
}
in.close();
out.close();

1.获取一个输入流,并将其用于访问服务器上的文件

2.使用ServletOutputStream类的getOutputStream()方法创建一个数据输出流,并将其用于输出文件数据

3.while循环逐个读取文件数据,并将其写入到输出流中

4.关闭输入输出流

压缩ZIP下载
1、设置响应类型和头信息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

Content-Type:用于指示接收方如何处理响应数据,并告知浏览器所需下载的文件类型

attachment:用于指示浏览器以下载方式显示响应数据

filename:用于指定下载文件的文件名

2、创建压缩流
 ZipOutputStream out = new ZipOutputStream(response.getOutputStream());

用于将数据压缩为ZIP文件格式。它提供了一种方便的方式来创建包含多个文件或目录的ZIP文件

response.getOutputStream():用于写入ZIP文件数据的输出流

3、向压缩文件中输出数据
            for (String object : objectLists) {
                ObsObject obsObject = obsClient.getObject(bucketName,object);
                String objectKey = obsObject.getObjectKey();
                if (!objectKey.endsWith("/")){
                    int index = objectKey.lastIndexOf("/");
                    String fileName = objectKey.substring(index+1);
                    out.putNextEntry(new ZipEntry(fileName));

                    InputStream in = obsObject.getObjectContent();
                    int b;
                    while ((b = in.read())!=-1){
                        out.write(b);
                    }
                }
            }
批量下载
public class MultiThreadDownloader {
    private static final int BUFFER_SIZE = 4096;
    private static final int NUM_THREADS = 4;
 
    public static void main(String[] args) {
        List urls = new ArrayList<>();
        urls.add("https://example.com/file1.txt");
        urls.add("https://example.com/file2.txt");
        urls.add("https://example.com/file3.txt");
        urls.add("https://example.com/file4.txt");
 
        int numFiles = urls.size();
        int numThreads = Math.min(numFiles, NUM_THREADS);
 
        List threads = new ArrayList<>();
        for (int i = 0; i < numThreads; i++) {
            int start = i * numFiles / numThreads;
            int end = (i + 1) * numFiles / numThreads;
            List subUrls = urls.subList(start, end);
            Thread thread = new DownloadThread(subUrls);
            thread.start();
            threads.add(thread);
        }
 
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
 
    private static class DownloadThread extends Thread {
        private List urls;
 
        public DownloadThread(List urls) {
            this.urls = urls;
        }
 
        @Override
        public void run() {
            for (String url : urls) {
                try {
                    downloadFile(url);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
        private void downloadFile(String urlStr) throws IOException {
            URL url = new URL(urlStr);
            String fileName = url.getFile().substring(url.getFile().lastIndexOf('/') + 1);
            BufferedInputStream in = new BufferedInputStream(url.openStream());
            FileOutputStream out = new FileOutputStream(fileName);
 
            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead;
            while ((bytesRead = in.read(buffer, 0, BUFFER_SIZE)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
 
            in.close();
            out.close();
        }
    }

1.将下载的文件 URL 存储在一个列表中,然后将其分成多个子列表,每个子列表由一个线程处理

2.每个线程都会遍历其子列表中的 URL,并下载每个文件

3.下载的文件将保存在当前工作目录中,文件名将从 URL 中提取

你可能感兴趣的:(Java,java)