当前位置: 首页 > news >正文

springboot实现文件上传到服务器上,并通过url访问

1,文件存储

外部用户可通过url访问服务器资源文件resources目录下的静态资源,但若是将上传的文件都保存在resources相关目录下,将会导致后续打包过大,程序和代码不分离,无法查看等问题。
解决方案:
文件上传到服务器某个目录,然后SpringBoot配置虚拟路径,映射到此目录。

2,访问问题

通过WebMvcConfigurer 的addResourceHandlers将匹配上虚拟路径的url映射到文件上传到服务器的目录,这样就可以通过url来获取服务器上的静态资源了。

3,详细步骤

(1)配置类
public class WebMvcConfiguration implements WebMvcConfigurer {
    
    @Autowired
    HandleReportServiceImpl fileService;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //将匹配上/files/**虚拟路径的url映射到文件上传到服务器的目录,获取静态资源
        registry.addResourceHandler("/" + fileService.pathPattern + "/**").addResourceLocations("file:" + fileService.filePath);
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }

}

(2)Controller类
    @ApiOperation(value = "上传模板", notes = "", response = String.class)
    @PostMapping("/upload")
    public Object upload(@RequestParam(value = "file", required = false) MultipartFile file, HttpSession session){
        return handleReportService.uploadReport(file,session);
    }
(3)Service类
@Service
public class HandleReportServiceImpl implements HandleReportService {

    @Value("${upload.uploadPath}")
    private String uploadPath;

    public String pathPattern = "files";

    private static final String fileDir = "fileStorage";

    public String filePath = System.getProperty("user.dir") + File.separator + fileDir + File.separator;


    @Override
    public Object uploadReport(MultipartFile file, HttpSession session) {
        return upload(file,session);
    }

    public Object upload(MultipartFile file,HttpSession session) {
        Map<String, Object> map = new HashMap<>();
        map.put("flag", true);
        String name = file.getOriginalFilename();
        //限制上传的文件,通过判断后缀的方式
        String fileF = name.substring(name.lastIndexOf("."));//文件后缀
        if (!(".docx".equals(fileF))) {
            map.put("flag", false);
            map.put("message", "请上传docx格式的文件!");
            return map;
        }
        String pathTemp = filePath + getDate() + "/";
        String filePaths = pathTemp + name;
        File f = new File(pathTemp);
        if (!f.exists()) {
            f.mkdirs();
        }
        File s = new File(filePaths);
        //直接上传
        try {
            file.transferTo(s);
        } catch (IOException e) {
            e.printStackTrace();
            map.put("flag", false);
            map.put("message", "上传失败,详细信息为:" + e.getMessage());
            return map;
        }
        map.put("message", "上传成功");
        map.put("path", filePaths);
        return map;
    }

会上传到项目根目录下的fileStorage目录下,如果是jar包会在jar包同目录下创建fileStorage

(4)最后通过http://localhost:8080/files/文件名访问。

相关文章:

  • Spring Boot + Spring Integration整合MQTT打造双向通信客户端
  • flowable适配达梦7 (2.1)
  • 【C++】:使用ACL给你的文件夹加锁
  • 直线画法-Bresenham‘s algorithm原理和最优实现
  • SSRF 攻击与防御:从原理到落地实践
  • 什么是Ecovadis认证(埃科瓦迪斯认证)?​Ecovadis认证(埃科瓦迪斯认证)的等级划分!
  • 【Zephyr】【二】学习笔记【RTOS系统架构】
  • VLAN综合实验
  • Linux|fork命令及其使用的写时拷贝技术
  • HyperAD:学习弱监督音视频暴力检测在双曲空间中的方法
  • id: ‘dev.flutter.flutter-plugin-loader‘, version: ‘1.0.0‘怎么解决
  • The Illustrated Stable Diffusion
  • [贪心算法]买卖股票的最佳时机 买卖股票的最佳时机Ⅱ K次取反后最大化的数组和 按身高排序 优势洗牌(田忌赛马)
  • 基础篇结束纪念——Java抽象类 模板类 static接口
  • 基于springboot的校园周边美食探索及分享平台(021)
  • 基于生成对抗网络(GAN)的图像超分辨率重建:技术与应用
  • 【深度】JADC2的层级结构以及全域Mesh网络
  • K8S集群新增和删除Node节点(K8s Cluster Adds and Removes Node Nodes)
  • 【动态规划】矩阵连乘问题 C++(附代码实例和复杂度分析)
  • 3. 轴指令(omron 机器自动化控制器)——>MC_SetOverride
  • 分类信息网站 建议 建设/优化设计答案五年级上册
  • 淄博外贸网站建设公司/海外推广方法有哪些
  • 快速建站代理/seo入门培训学校
  • 贵阳建设网站/阿里域名注册官网
  • 网站建设 上海交大/搜易网提供的技术服务
  • web前端开发工程师招聘要求/湖南企业seo优化报价