SpringBoot

文件分享

指定项目的目录为文件上传目录

1
2
//System.getProperty("user.dir")会得到当前项目的根目录
public final String FILE_UPLOAD_DIR = System.getProperty("user.dir") + "/images/";

接口参数设计:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@PostMapping("/photo")
public Result savePhoto(HttpServletRequest httpServletRequest, @RequestParam("image") MultipartFile image) throws BaseException {
    //获取原始文件名称,目的是为了获取到原始文件的后缀
    String originalFilename = image.getOriginalFilename();
    //获取文件的后缀名
    String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
    //通过uuid来生成唯一的文件名前缀存储在服务器
    UUID uuid = UUID.randomUUID();
    //拼接uuid的字符串和文件后缀名作为新的文件名
    String newFilename = uuid.toString() + fileSuffix;
    //创建我们所需要的存储文件的目录
    File fileDirectory = new File(FILE_UPLOAD_DIR);
    //destFile代表上传文件在服务器端保存的目标文件。形参的image变量只是存在了内存中
    File destFile = new File(FILE_UPLOAD_DIR + newFilename);

    //判断目录是否存在
    if (!fileDirectory.exists()) {
        //如果不存在,则创建目录,如果创建失败了,那么抛出异常
        if (!fileDirectory.mkdir()) {
            throw new BaseException(ExceptionEnum.MKDIR_FAILED);
        }
    }
    //将image转存到目标文件
    try {
        image.transferTo(destFile);
    } catch (IOException e) {
        e.printStackTrace() ;
    }
    try {
        return Result
                .success(getHost(new URI(httpServletRequest.getRequestURL() + "")) + "/images/"
                        + newFilename);
    } catch (URISyntaxException e) {
        return Result.error(ExceptionEnum.UPLOAD_FAILED);
    }
}

/*
在该代码中,我们需要一个新的URI对象,是因为我们只关注URL中的主机信息(即协议、主机名和端口号),而不关注查询参数、片段等其他信息。因此,为了方便程序在之后的操作中引用这些主机信息,我们可以创建一个新的URI对象,其中仅包含协议、主机名和端口号。
另外,该代码中创建新的URI对象时使用了原来URI对象的一些属性,比如协议、用户信息、主机名和端口号等。这样可以确保创建的新的URI对象与原来的URI对象具有相同的协议、主机名和端口号,从而保证程序功能正确性。
*/
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;
}

我们将文件上传到服务器之后,并不能直接通过链接来访问到我们的文件,这是因为没有配置资源映射:在Spring Boot中,需要将图片所在的目录配置为静态资源目录,否则系统无法找到图片。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    public final String FILE_UPLOAD_DIR = System.getProperty("user.dir") + "/images/";;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/images/**")
                .addResourceLocations("file:" + FILE_UPLOAD_DIR);
        
        //下面是一些映射其他静态资源的示例
//        registry.addResourceHandler("swagger-ui.html").addResourceLocations(
//                "classpath:/META-INF/resources/");
//        registry.addResourceHandler("/webjars/**").addResourceLocations(
//                "classpath:/META-INF/resources/webjars/");
    }
}