springboot单文件上传到指定目录分类并返回访问路径

业务逻辑就不写service层了,方便展示.还没放到linux中测试....

问题解决

  • 使用ubuntu运行测试,并设置yml里的变量 path: /upload/出现了如下异常

    • FileNotFoundException: /upload/jpg/1595516455456eyes.jpg (No such file or directory)

    • 手动创建jpg子目录后出现新的异常

    • FileNotFoundException: /upload/jpg/1595516494684eyes.jpg (Permission denied)

    • 给/upload文件夹设置权限0777 上传成功,输入返回的url并成功访问

      {
        "code": 200,
        "msg": "操作成功",
        "data": "http://192.168.153.128:8086/archive/jpg/1595517483320eyes.jpg"
      }
      
    • 上传md格式的文件,成功创建了md目录,保存并返回url,输入url浏览器自动下载

  • 欢迎大佬题出更好意见

yml和配置类

yuan:
  file:
    root:
      ## 定义文件保存的路径
      path: D:\develop\upload\
# ..... 省略其他无关配置
spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 10MB # 设置文件最大大小
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Value("${yuan.file.root.path}")
    public String fileRootPath;

    /**
     * 资源映射:把请求的/archive/** 映射到该文件根路径
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/archive/**").addResourceLocations("file:" + fileRootPath);
    }
}

Controller层

@Api("文件操作相关")
@RestController
public class FileController {

    @Value("${yuan.file.root.path}")
    public String fileRootPath;

    @ApiOperation("文件上传")
    @PostMapping("/upload")
    public Result upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        String filePath = ""; // 文件保存的位置
        String urlPath = "";// 文件web浏览路径
        Assert.isTrue(!file.isEmpty(), "文件为空");
        // 原始名 以 a.jpg为例
        String originalFilename = file.getOriginalFilename();
        // 获取后缀并拼接'/'用于分类,也可以用日期 例: suffix = "jpg/"
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1) + "/";
        // 加上时间戳生成新的文件名,防止重复 newFileName = "1595511980146a.jpg"
        String newFileName = System.currentTimeMillis() + originalFilename;
        filePath = fileRootPath + suffix + newFileName;
        System.out.println(filePath);
        try {
            File file1 = new File(filePath);
            if (!file1.exists()) file1.mkdirs(); // 要是目录不存在,创建一个
            file.transferTo(file1);              // 保存起来
            urlPath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/archive/" + suffix + newFileName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return Result.succ(urlPath);
    }

}

结果




参考

springboot 如何上传图片文件到服务器的指定目录
文件上传报错java.io.FileNotFoundException拒绝访问

posted @   禾几元  阅读(2680)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示