0


企业级-实现Nginx的静态文件服务器映射

作者: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
 */@ControllerpublicclassFilePreviewController{//本地测试可改为自己的路径//private static final String FILE_DIRECTORY = "D:/upload/";privatestaticfinalStringFILE_DIRECTORY="/data/hqzr/";@ResponseBody@RequestMapping(value ="/file/{fileUrl}/**",  method =RequestMethod.GET)publicvoidgetFile(@PathVariableString fileUrl,HttpServletRequest req,HttpServletResponse resp)throwsIOException{String path = req.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString();String path2 = req.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString();String args =newAntPathMatcher().extractPathWithinPattern(path2, path);

        args = args.replace(".do","");

        fileUrl = fileUrl +"/"+ args;File file =newFile(FILE_DIRECTORY+ fileUrl);byte[] bytes =null;// 添加安全检查,确保文件确实在预期的目录中if(!file.exists()||!file.isFile()||!file.getCanonicalPath().startsWith(newFile(FILE_DIRECTORY).getCanonicalPath())){// 处理非法访问,例如返回404File parentDir = file.getParentFile();if(!parentDir.exists()){
                parentDir.mkdirs();// 确保文件所在的目录存在}
            bytes =OssUtil.downloadByBytes(FILE_DIRECTORY+ fileUrl);if(null!= bytes){FileOutputStream fos =newFileOutputStream(file);
                fos.write(bytes);
                fos.close();
                resp.reset();// 非常重要}else{Map<String,String> map =newHashMap<String,String>();
                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 =newBufferedInputStream(newFileInputStream(file))){// 从文件服务器获取if(null!= bytes){
                outputStream.write(bytes);}else{// 从本地获取byte[] buffer =newbyte[4096];int bytesRead =-1;// 读取文件内容并写入响应while((bytesRead = inputStream.read(buffer))!=-1){
                    outputStream.write(buffer,0, bytesRead);}}// 刷新输出流,确保所有数据都被发送
            outputStream.flush();}}privateStringgetMimeType(File file){// 这里可以根据文件扩展名返回相应的MIME类型// 这里只是一个简单的示例,实际应用中可能需要更复杂的逻辑String filename = file.getName().toLowerCase();if(filename.endsWith(".png")){returnMediaType.IMAGE_PNG_VALUE;}elseif(filename.endsWith(".jpg")|| filename.endsWith(".jpeg")){returnMediaType.IMAGE_JPEG_VALUE;}// 添加更多MIME类型判断...returnMediaType.APPLICATION_OCTET_STREAM_VALUE;// 默认类型}}

三、总结

简洁、高效、实用!

标签: java

本文转载自: https://blog.csdn.net/F15217283411/article/details/140773963
版权归原作者 嗝屁小孩纸 所有, 如有侵权,请联系我们删除。

“企业级-实现Nginx的静态文件服务器映射”的评论:

还没有评论