前言
当你使用tomcat发布项目的时候,上传文件存放会变得非常简单,因为你可以随意操作项目路径下的资源。但是当你使用SpringBoot的jar包发布项目的时候,你会发现,你不能像以前一样操作文件了。其实原因你也想的到,你无法对jar包里面的资源进行操作,而对于springboot项目来说,你只能读取里面的文件,只能使用InputStream。
解决办法
因为我们无法操作jar包内容,所以我们只能将文件存放在别的位置,与jar包同级的目录是一个不错的选择。
这是一个重点也是必须掌握的知识,IDEA运行和jar包运行是不同的,这篇博客主要目的是解决遗留问题:SpringBoot实现文件上传与下载
废话少说,上代码:项目结构:
controller包的Upload代码:
package com.shmily.ldx.controller;
import com.shmily.ldx.MyContent.MyContent;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@RestController
public class Upload {
@RequestMapping("/upload")
public Map<String,String> upload(MultipartFile file, HttpServletRequest request) throws IOException {
//获取上传图片的原始名称
String filename=file.getOriginalFilename();
//获取上传文件的图片大小
long size = file.getSize();
//获取上传文件的mime类型
String contentType = file.getContentType();
Map<String,String> map=new HashMap<>();
if(file.isEmpty()){
map.put("code","200");
map.put("reason","您上传的文件为空");
return map;
}
//获取当前目录所在位置
String root= MyContent.PRO_PATH;
File img = new File(root, "img");
if(!img.exists()){
img.mkdirs();
}
//获取当前时间戳
long time = new Date().getTime();
String replace= UUID.randomUUID().toString().replace("-","");
String newFilename = time + "-" + replace + filename.substring(filename.lastIndexOf("."));
file.transferTo(new File(root+File.separator+"img"+File.separator,newFilename));
map.put("code","200");
map.put("reason","您的照片已被我们收录");
map.put("path",root);
return map;
}
}
MyContent包下的MyContent类代码:
package com.shmily.ldx.MyContent;
public class MyContent {
//日期格式化模板字符串
public static final String DATE_FORMAT_STR="yyyy-MM-dd HH:mm:ss";
//系统文件路径分隔符
public static final String FILE_SER = System.getProperty("file.separator");
//项目路径
public static final String PRO_PATH = System.getProperty("user.dir");
//文件存储目录名
public static final String UPLOAD_DIR="upload";
//文件上传存储路径
public static final String UPd1LOAD_PATH=PRO_PATH+FILE_SER+UPLOAD_DIR;
//随机路径取值基础字符串(16进制)
public static final String HEX_STR="0123456789ABCDEF";
}
重点在这里,webmvcconfig下的WebMvcConfig的代码,做的是访问(URL请求访问)路径映射,MyContent.PRO_PATH为自己封装的项目具体路径
package com.shmily.ldx.webmvcconfig;
import com.shmily.ldx.MyContent.MyContent;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//客户端访问地址前缀
registry.addResourceHandler("/static/**")
.addResourceLocations("file:"+ MyContent.PRO_PATH+"/img/");
}
}
没什么可说的,不懂的留言即可
测试结果实验奉上:(测试工具是postman)
首先展示在IDEA中运行文件路径效果,再测试jar包的
postman上传图片:
上传发送:成功!!!
来看看img文件的位置
明显与src包或target包同级
文件目录:
再测试一下映射后的路径能访问吗,成功!!!
好,我们测试jar包运行条件
Maven打包
运行jar包
同样的方式用postman上传
成功上传,注意这里我返回的img文件夹位于的路径
文件夹情况:
相同的访问方式:访问IDEA实验时上传的图片,成功访问不到
原因在于jar包中没有这张图片,它只位于IEDA的项目包下,并不是jar包
访问我们jar包环境下上传的图片:
毫无疑问肯定成功!!!
代码是b站老师的比较简单,实验结果我帮你们对比分析结束,下课!!!