使用Java根据文件路径下载zip文件到本地

需求:下载目标文件,其中目标文件是本地某个文件中的zip文件,如:D:/CODE/test.zip。

1. 代码示例:

    /**
     * 下载目标文件,其中目标文件是zip文件
     *
     * @param targetFile 目前文件
     * @param response
     * @return
     */
    @GetMapping("/download")
    @ApiOperation("下载目标文件,其中目标文件是zip文件")
    public void download(@RequestParam String targetFile, HttpServletResponse response) {
        // 读取目标zip文件,并利用response输出 D:\CODE\Git_dy
        String folderPath = "D:/CODE/";
        String filePath = folderPath + targetFile;

        try (FileInputStream fileInputStream = new FileInputStream(filePath)) {
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=\"" + targetFile + "\"");
            response.setHeader("Access-Control-Allow-Origin", "*");

            File downloadFile = new File(filePath);
            if (downloadFile.exists()) {
                FileInputStream myStream = new FileInputStream(filePath);
                IOUtils.copy(myStream, response.getOutputStream());
            }
            response.flushBuffer();
            log.info("获取文件成功!");
        } catch (IOException e) {
            log.error(e.getMessage());
        }
    }

其中:IOUtils的包是:package org.apache.tomcat.util.http.fileupload在这里插入图片描述

2. 代码解析:

response.setHeader(name, value)方法中,name参数表示要设置的HTTP响应头的名称,value参数表示该响应头的值。HTTP响应头允许服务器向浏览器传递关于响应的一些元信息。
在包org.springframework.http下面:包含了各种请求头名称:如
在这里插入图片描述


以下是一些常见的HTTP响应头名称及其示例:

response.setHeader("Content-Type", "text/html; charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=\"example.txt\"");
response.setHeader("Cache-Control", "max-age=3600");
response.setHeader("Expires", "Thu, 01 Dec 2023 16:00:00 GMT");
response.setHeader("Set-Cookie", "sessionid=123456789; Path=/; Secure; HttpOnly");
response.setHeader("Location", "https://www.example.com");

String contentType = HttpHeaders.CONTENT_TYPE;
String contentDisposition = HttpHeaders.CONTENT_DISPOSITION;
String cacheControl = HttpHeaders.CACHE_CONTROL;
String expires = HttpHeaders.EXPIRES;
String setCookie = HttpHeaders.SET_COOKIE;
String location = HttpHeaders.LOCATION;

  1. Content-Type: 指定响应体的MIME类型,告诉浏览器如何处理响应的内容。
  2. Content-Disposition: 设置下载的文件名和方式。通常用于文件下载时,指定文件名和打开方式。
  3. Cache-Control: 控制缓存的行为,例如缓存的有效时间和是否允许缓存。
  4. Expires: 设置响应的过期时间,用于控制浏览器是否需要重新请求资源。
  5. Set-Cookie: 设置一个HTTP Cookie,用于在客户端存储会话信息或其他数据。
  6. Location: 用于重定向,指示浏览器应该跳转到哪个URL。

"application/octet-stream"是一个通用的MIME类型,用于表示未知的二进制数据。在HTTP响应头中,如果服务器不知道要传输的数据的具体MIME类型,通常会使用"application/octet-stream"来表示通用的二进制数据类型。


HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN是一个HTTP响应头,用于实现跨域资源共享(Cross-Origin Resource Sharing,CORS)。CORS是一种机制,允许Web浏览器在同源策略限制下向不同源(域名、端口、协议)的服务器发送跨域请求。

  • *: 表示允许任意源(任意域名、任意端口、任意协议)的请求访问资源,这样的配置允许所有网站访问资源,但可能会存在安全风险,不推荐在生产环境中使用。
  • 具体的域名: 表示允许特定的域名访问资源,例如http://example.com,这样的配置只允许example.com域名的请求访问资源。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题需要用到Java的IO流和压缩库。大致思路如下: 1. 读取txt文件中的每一行,获取文件的URL路径。 2. 根据URL路径创建一个URLConnection对象,获取该文件的输入流。 3. 将输入流写入本地的一个文件中,可以用FileOutputStream实现。 4. 遍历完所有的URL路径后,将所有下载文件压缩成一个zip包,可以用ZipOutputStream实现。 下面是一个简单的实现代码,仅供参考: ```java import java.io.*; import java.net.*; import java.util.zip.*; public class FileDownloader { public static void main(String[] args) throws IOException { String urlFile = "urls.txt"; // 存放URL路径文件 String downloadDir = "downloads"; // 下载文件存放的目录 String zipFile = "downloads.zip"; // 压缩后的zip包 // 创建下载目录 File dir = new File(downloadDir); if (!dir.exists()) { dir.mkdir(); } // 读取URL路径文件 BufferedReader reader = new BufferedReader(new FileReader(urlFile)); String line; while ((line = reader.readLine()) != null) { // 创建URL连接 URL url = new URL(line); URLConnection conn = url.openConnection(); // 获取文件名 String fileName = url.getFile(); fileName = fileName.substring(fileName.lastIndexOf('/') + 1); // 创建文件输出流 FileOutputStream fos = new FileOutputStream(new File(downloadDir, fileName)); // 复制输入流到输出流 InputStream is = conn.getInputStream(); byte[] buffer = new byte[4096]; int len; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } fos.close(); is.close(); } reader.close(); // 压缩下载文件 FileOutputStream fos = new FileOutputStream(zipFile); ZipOutputStream zos = new ZipOutputStream(fos); for (File file : dir.listFiles()) { byte[] buffer = new byte[4096]; FileInputStream fis = new FileInputStream(file); zos.putNextEntry(new ZipEntry(file.getName())); int len; while ((len = fis.read(buffer)) != -1) { zos.write(buffer, 0, len); } zos.closeEntry(); fis.close(); } zos.close(); fos.close(); } } ``` 注意:实际应用中需要加入异常处理和错误提示等逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值