企业级-实现Nginx的静态文件服务器映射
创始人
2024-11-16 00:38:23
0

作者:fyupeng
技术专栏:☞ https://github.com/fyupeng
项目地址:☞ https://github.com/fyupeng/distributed-blog-system-api


留给读者

开发人员往往会经常需要通过浏览器下载文件、图片或者PDF或者缩略图等,这时候我们可以根据自己的需求自定义设置,安全性就可以由自己来把握。

一、介绍

难点主要在于把文件路径当成参数传给后端,后端根据一定的规则处理,将结果写入响应返回给浏览器。

优点

  • 使用懒加载方式,如果本地有,就不从OSS获取,本地没有先从OSS下载到本地,以便频繁下载文件时降低OSS的出入流量。
  • 待补充

二、代码

/**  * @Auther: fyp  * @Date: 2024/7/26  * @Description: 文件预览处理器  * @Package: com.gwssi.common.web  * @Version: 1.0  */  @Controller public class FilePreviewController {      //本地测试可改为自己的路径     //private static final String FILE_DIRECTORY = "D:/upload/";     private static final String FILE_DIRECTORY = "/data/hqzr/";      @ResponseBody     @RequestMapping(value = "/file/{fileUrl}/**",  method = RequestMethod.GET)     public void getFile(@PathVariable String fileUrl, HttpServletRequest req, HttpServletResponse resp) throws IOException {           String path = req.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();         String path2 = req.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();         String args = new AntPathMatcher().extractPathWithinPattern(path2, path);          args = args.replace(".do", "");          fileUrl = fileUrl + "/" + args;          File file = new File(FILE_DIRECTORY + fileUrl);          byte[] bytes = null;          // 添加安全检查,确保文件确实在预期的目录中         if (!file.exists() || !file.isFile() || !file.getCanonicalPath().startsWith(new File(FILE_DIRECTORY).getCanonicalPath())) {             // 处理非法访问,例如返回404             File parentDir = file.getParentFile();             if (!parentDir.exists()) {                 parentDir.mkdirs(); // 确保文件所在的目录存在             }             bytes = OssUtil.downloadByBytes(FILE_DIRECTORY + fileUrl);             if (null != bytes) {                 FileOutputStream fos = new FileOutputStream(file);                 fos.write(bytes);                 fos.close();                 resp.reset(); // 非常重要             } else {                 Map map = new HashMap();                 map.put("code", "-100");                 map.put("msg", "文件预览失败");                 ResponseUtil.returnFrontByJSON(map, resp);             }         }         // 设置适当的响应头(纯下载方式)         //resp.setContentType("application/octet-stream; charset=utf-8");         //resp.setHeader("Content-Disposition", "attachment;filename=" + file.getName());         // 直接预览打开         resp.setContentType("image/png"); // 设置返回的文件类型         resp.addHeader("Content-Length", String.valueOf(file.length()));  //文件大小          // 使用ServletOutputStream将图片数据写入响应         try (ServletOutputStream outputStream = resp.getOutputStream();              BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {              // 从文件服务器获取             if (null != bytes) {                 outputStream.write(bytes);             } else {                 // 从本地获取                 byte[] buffer = new byte[4096];                 int bytesRead = -1;                  // 读取文件内容并写入响应                 while ((bytesRead = inputStream.read(buffer)) != -1) {                     outputStream.write(buffer, 0, bytesRead);                 }             }             // 刷新输出流,确保所有数据都被发送             outputStream.flush();         }     }    private String getMimeType(File file) {       // 这里可以根据文件扩展名返回相应的MIME类型       // 这里只是一个简单的示例,实际应用中可能需要更复杂的逻辑       String filename = file.getName().toLowerCase();       if (filename.endsWith(".png")) {           return MediaType.IMAGE_PNG_VALUE;       } else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg")) {           return MediaType.IMAGE_JPEG_VALUE;       }       // 添加更多MIME类型判断...       return MediaType.APPLICATION_OCTET_STREAM_VALUE; // 默认类型     } }  

三、总结

简洁、高效、实用!

相关内容

热门资讯

揭秘一下!黑科技辅助器,蘑菇云... 揭秘一下!黑科技辅助器,蘑菇云辅助怎么使用,科技辅助开挂器(有挂细节);打开点击测试直接进入微信(1...
每日必看!广西老友辅助,多乐跑... 每日必看!广西老友辅助,多乐跑辅助,起初有开挂辅助安装(有挂教程);无需打开直接搜索薇:136704...
透视安卓版!新518互游插件下... 透视安卓版!新518互游插件下载,微乐自建房插件免费软件(新2026版开挂辅助挂);亲,微乐自建房插...
重大通报!福建微乐小程序修改器... 重大通报!福建微乐小程序修改器,悠闲卡五星辅助,通报辅助挂(有挂辅助);无需打开直接搜索薇:1367...
发现一款!悠闲卡五星辅助,佛手... 您好:这款佛手在线大菠萝辅助游戏是可以开挂的,确实是有挂的,很多玩家在这款佛手在线大菠萝辅助游戏中打...
透视黑科技!wepoker游戏... 透视黑科技!wepoker游戏下载,广东雀神智能插件可测试(教你攻略开挂辅助安装) 了解更多开挂安装...
玩家必看攻略!河洛杠次辅助,微... 您好:河洛杠次辅助这款游戏可以开挂的,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别...
盘点一款!科乐填大坑攻略,波特... 科乐填大坑攻略开挂教程视频分享装挂详细步骤在当今的网络游戏中,科乐填大坑攻略作为一种经典的娱乐方式,...
透视能赢!雀神广东麻将推倒胡辅... 透视能赢!雀神广东麻将推倒胡辅助器下载,海贝之城透视辅助器(AI教程辅助开挂插件);无需打开直接搜索...
科技揭秘!微信边锋辅助器,开心... 科技揭秘!微信边锋辅助器,开心泉州辅助,分析辅助工具(有挂方法);亲,微信边锋辅助器这款游戏原来确实...