在日常的开发的,存储文件我们一般会用到云存储,如阿里云,华为云等。云存储的 URL 可以直接在浏览器访问,因为对象存储 OSS 支持 HTTP 直连访问,只要权限允许,URL 就是一个公网资源地址。但是在开发中,如果我们想把文件存储在本地的服务器中,我们通常会有两种方法。1 使用二进制流访问文件信息,2 通过nginx代理访问信息。下面来演示这两种方法。
1.使用二进制流如何下载本地文件
典型场景:
前端传一个文件存储路径(本地磁盘)
后端用二进制流读取文件 → 返回给浏览器下载
一、Controller 下载接口(核心代码)
支持:本地文件路径 → 浏览器下载
@GetMapping("/download") public void download(@RequestParam("path") String filePath, HttpServletResponse response) { File file = new File(filePath); if (!file.exists()) { throw new RuntimeException("文件不存在:" + filePath); } response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); // 文件名处理(防止中文乱码) String fileName = URLEncoder.encode(file.getName(), StandardCharsets.UTF_8) .replaceAll("\\+", "%20"); response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + fileName); try (InputStream in = new BufferedInputStream(new FileInputStream(file)); OutputStream out = new BufferedOutputStream(response.getOutputStream())) { byte[] buffer = new byte[8192]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); } out.flush(); } catch (Exception e) { throw new RuntimeException("文件下载失败", e); } }二、前端访问方式
浏览器直接访问:
http://localhost:8080/download?path=/data/files/test.pdf就会自动下载文件。
2.使用ngnix代理访问本地存储文件
使用 Nginx 代理访问本地存储文件是生产环境里非常常见、性能也最好的方案(比 Java 流式下载更快、更省服务器资源)。
一、场景示意
假设:
服务器磁盘目录: /data/files/ ├── a.pdf ├── img.png └── report.docx你希望访问:
http://your-domain/files/a.pdf直接打开 / 下载文件。
二、Nginx 配置(核心)
编辑 nginx 配置文件:
vim /etc/nginx/nginx.conf添加:
server { listen 80; server_name localhost; # 或你的域名 / IP location /files/ { alias /data/files/; # ⚠️ 必须以 / 结尾 autoindex off; # 关闭目录浏览(安全) # 下载文件(强制下载) add_header Content-Disposition attachment; # 允许大文件 client_max_body_size 1024m; } }关键说明(非常重要)
location /files/访问路径前缀
alias /data/files/ 映射到磁盘目录
三、重载 Nginx
nginx -t # 检查配置是否正确 nginx -s reload四、访问测试
浏览器访问:
http://localhost/files/a.pdf如果能下载,说明配置成功 ✅