SpringBoot 自定义静态资源文件

用SpringBoot做web项目有时候需要上传文件,Controller接收的文件存储到哪呢?

存到request.getServletContext().getRealPath()下?可以,但是不推荐这样:

  • 由于springboot一般是jar包启动,再次启动之前上传的文件会被清除,这种方式仅可做测试;或者采用SpringBoot依赖容器的启动方式,放到tomcat等容器中,这样上传的文件不会因重启清除。

推荐:

  • 保存到文件系统的一个根项目无关路径,比如/tmp/iqismart

操作步骤:

  • 修改application.properties文件,增加存储目录的配置
//...省略
web.upload.path=/tmp/iqismart
//...省略
  • 重写WebMvcConfigurerAdapter的addResourceHandlers方法,添加自定义资源文件处理器

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
 
    @Value("${web.upload.path}")
    private String uploadPath;

    //...省略

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/upload/**").addResourceLocations("file:"+uploadPath+ File.separator+"upload"+File.separator);
        super.addResourceHandlers(registry);
    }
}

    //... 省略
  • 文件存储工具类

@Component
public class FileUploadUtils {
    public static String PREFIX_IMAGE_AVATAR = File.separator+"upload"+File.separator+"images"+File.separator+"avatar";

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

    public String upload(String prefix,Long uid,InputStream inputStream) throws IOException {
        String userRoot = File.separator+uid%1000+File.separator+uid;
        String currentAvatarFileName =Calendar.getInstance().get(Calendar.HOUR_OF_DAY)+ "" + Calendar.getInstance().get(Calendar.MINUTE);

        String avatar = prefix+userRoot + File.separator+currentAvatarFileName+".png";
        File saveFile = new File(uploadPath+avatar  );
        if (!saveFile.getParentFile().exists()) {
            saveFile.getParentFile().mkdirs();
        }
        IOUtils.copy(inputStream,new FileOutputStream(saveFile));
        return avatar;
    }
}

(全文完)

(转载本站文章请注明作者和出处 SpringBoot 自定义静态资源文件