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<String> 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<Thread> threads = new ArrayList<>();
        for (int i = 0; i < numThreads; i++) {
            int start = i * numFiles / numThreads;
            int end = (i + 1) * numFiles / numThreads;
            List<String> 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<String> urls;
 
        public DownloadThread(List<String> 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 中提取

  • 19
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现文件下载功能可以使用Java IO中的InputStream和OutputStream,以及HttpURLConnection类来实现。下面是一个简单的示例代码: ```java import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class DownloadFile { public static void main(String[] args) { try { URL url = new URL("http://example.com/file.pdf"); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); int responseCode = httpConn.getResponseCode(); // 判断HTTP响应是否成功 if (responseCode == HttpURLConnection.HTTP_OK) { String fileName = ""; String disposition = httpConn.getHeaderField("Content-Disposition"); // 如果Content-Disposition头部存在,则从中提取文件名 if (disposition != null) { int index = disposition.indexOf("filename="); if (index > 0) { fileName = disposition.substring(index + 10, disposition.length() - 1); } } // 没有Content-Disposition头部,则从URL中提取文件名 else { fileName = url.getFile().substring(url.getFile().lastIndexOf("/") + 1, url.getFile().length()); } // 获取文件输入流和输出流 InputStream inputStream = httpConn.getInputStream(); OutputStream outputStream = new FileOutputStream("C:\\downloads\\" + fileName); // 将输入流写入输出流,实现文件下载 byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } // 关闭输入流和输出流 outputStream.close(); inputStream.close(); System.out.println("文件下载完成"); } else { System.out.println("文件下载失败,HTTP响应码:" + responseCode); } httpConn.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } ``` 这个示例代码使用HttpURLConnection发送GET请求获取文件输入流,然后将输入流写入文件输出流。通过设置Content-Disposition头部可以获取到文件名,如果无法获取则从URL中提取文件名。文件下载成功后关闭输入流和输出流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值