SpringBoot通过UUid实现文件上传接口及问题解决

时间:2024-04-10 07:35:19

在controller中,添加对应的方法体:

 @PostMapping("/upload")
    @ResponseBody
    public ApiRestResponse upload(HttpServletRequest httpServletRequest, @RequestParam("file")MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
//        截取.前面的文件名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        UUID uuid = UUID.randomUUID();
        String newFileName = uuid.toString() + suffixName;
//        文件目录
        File fileDirectory = new File(Constant.FILE_UPLOAD_DIR);
//        文件名,Constant是我定义的常量类,具体内容在后面    
    File destFile = new File(Constant.FILE_UPLOAD_DIR + newFileName);
        if(!fileDirectory.exists()){
            if (!fileDirectory.mkdir()) {
                throw new PlatformException(PlatformExceptionEnum.MAKEIDR_FAILED);
            }
        }
        try {
//            需要注意,当你在transferTo这个方法中传入了相对路径,该方法会自动为你拼接上一个默认的路径,会导致虽然保存成功,但是你却找不到该文件
            file.transferTo(destFile);
        }catch (IOException e){
            e.printStackTrace();
        }
        try{
//            通过getHost方法回显,获得文件名
            return  ApiRestResponse.success(getHost(new URI(httpServletRequest.getRequestURI()+ "")) + "/files/" + newFileName);
        }catch (URISyntaxException e) {
            return ApiRestResponse.error(PlatformExceptionEnum.UPDATE_FAILED);
        }

    }

//回显方法

private URI getHost(URI uri){
    URI effectiveURI;
    try{
        effectiveURI = new URI(uri.getScheme(),uri.getUserInfo(),uri.getHost(),uri.getPort(),null,null,null);
    }catch( URISyntaxException e){
        effectiveURI = null;
    }
    return effectiveURI;
}

Constant的内容,需要注意的是@Value("${file.upload.dir}")中$符号后的是一对{},这里我已经踩过坑了。
 
对应在application.properties中的配置是,需要注意的是从本地计算机中复制过来的地址样式会是D:\src\main...,需要把\改成/,才能被正常读取,否则用这个路径去保存是一定会找不到的。另外结尾也要记得加上/,因为代码中是直接将地址和文件名拼接在一起,然后保存的,所以需要加上/。

注意的是,代码中还没有包含对静态资源的映射,需要添加一个config实现,缺少这个会影响保存后的显示