SpringBoot实现文件上传和访问
用springboot实现文件的上传和访问。文件的上传首先会用到相关的工具类,Jar包,
Maven项目需要jar包:
<!-- https://mvnrepository.com/artifact/commons-io/commons-io IO 文件流需要的包-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload 文件上传需要的包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
如果放入项目中pom.xml 文件有错误,可以根据自己需要的版本去添加 :
maven官网地址:https://mvnrepository.com
在spring boot项目打成jar包后,上传文件的路径会有问题,或者可以成功上传但是服务器上找不到上传成功的文件。这时候我们需要为上传文件设置绝对路径。
上传工具类:
public class FileUploadController {
/**
* 图片上传
* @param myfiles
* @param request
* @param response
* @return
*/
@RequestMapping("/upload")
public static Object uploadApk(MultipartFile myfiles, HttpServletRequest request,
HttpServletResponse response) {
Map<String, Object> resMap = new HashMap<String, Object>();
if(myfiles.getSize()>1024*1024*5){
resMap.put("code", 500);
resMap.put("msg", "文件过大,请上传5M以内的图片");
System.out.println("文件上传失败");
return resMap;
}
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path;
Date dt = new Date();
Long time = dt.getTime();
if (myfiles != null) {
String realPath ="d://uploadFiles/"; // 获取保存的路径,本地磁盘中的一个文件夹
if (myfiles.isEmpty()) {
// 未选择文件
resMap.put("code", 400);
resMap.put("msg", "未选择文件");
} else {
// 文件原名称
String originFileName = "";
// 上传文件重命名
String originalFilename = time.toString().substring(time.toString().length() - 8,
time.toString().length());
originalFilename = originalFilename.concat(".");
originalFilename = originalFilename.concat(myfiles.getOriginalFilename().toString()
.substring(myfiles.getOriginalFilename().toString().indexOf(".") + 1));
try {
// 这里使用Apache的FileUtils方法来进行保存
FileUtils.copyInputStreamToFile(myfiles.getInputStream(), new File(realPath, originalFilename));
resMap.put("code", 200);
resMap.put("msg", "上传成功");
resMap.put("filename", originalFilename);
resMap.put("path", basePath + "/static/image/"+originalFilename );
} catch (IOException e) {
resMap.put("code", 500);
System.out.println("文件上传失败");
resMap.put("msg", "文件上传失败");
e.printStackTrace();
}
}
}
String param= JSON.toJSONString(resMap);
System.out.println(param);
return resMap;
}
}
此工具类将上传的文件会有一次重命名,特别要注意的是。文件上传的保存的路径,我们需要将上传的文件保存在本地的磁盘中,然后通过配置文件中配置的路径去访问。如果不将文件存在本地,项目打成Jar包后, 文件可以上传, 但访问不成功, 导致 访问的图片都加载不到.
上传接口
@RequestMapping("/updateheader")
public ResultModel updatehead(MultipartFile myfiles, String token, HttpServletRequest request,
HttpServletResponse response, Member mm) {
Map<String, Object> map = (Map<String, Object>) FileUploadController.uploadApk(myfiles, request, response);//调用工具类,将文件上传。特别要注意的是 参数中的第一个参数。MultipartFile myfiles, myfiles 的名称要和页面中 <input type="file" name="myfiles" /> 中的name名称保持一致,否则获取不到你上传的文件,文件上传成功后会返回一个MAP集合。
mm.setM_logo(map.get("path").toString());
int bool = userService.updatemember(mm);
if (bool > 0) {
ResultModel model = new ResultModel();
model.setCode(200);
model.setDetail(map.get("path").toString());
model.setMsg("更换成功");
return model;
} else {
return error(500, "系统异常");
}
}
关于页面的提交,可以用form表单提交,也可以使用相关的前端上传文件的插件上传,例如:ajaxfileload ,bootstrap 中的fileinput
都可以进行上传文件。根据需要自由选择,我使用的是表单提交。
这是还没有上传头像
控制台会打印返回的信息:
{"msg":"上传成功","path":"http://192.168.1.179:8080/static/image/91492957.jpg","code":200,"filename":"91492957.jpg"}
http://192.168.1.179:8080/static/image/91492957.jpg 这就是文件上传返回的绝对路径,如果你没有配置通过虚拟路径访问的配置,即使你上传成功了,通过这个路径也访问不到。
如果你上传图片之后,显示还是这样子,上传的图片的路径也正确,就是访问不到,关键时刻到了,缺少相关配置,
下面是配置信息:
首先是需要一个类
一:UploadFilePathConfig配置类
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 设置虚拟路径,访问绝对路径下资源
* @author Administrator
*
*/
@Configuration
public class UploadFilePathConfig implements WebMvcConfigurer{
@Value("${file.staticAccessPath}")
private String staticAccessPath;
@Value("${file.uploadFolder}")
private String uploadFolder;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler(staticAccessPath).addResourceLocations("file:" + uploadFolder);
}
}
这是设置虚拟的路径,通过虚拟的路径访问绝对路径下的文件。
二:在application.properties 中进行配置
#jsp静态资源配置
spring.mvc.view.prefix=/admin/
spring.mvc.view.suffix=.jsp
#配置静态资源访问路径
spring.mvc.static-path-pattern=/webapp/**
#静态资源对外暴露的访问路径
file.staticAccessPath=/static/image/**
#文件上传目录(注意Linux和Windows上的目录结构不同)
#file.uploadFolder=/root/uploadFiles/
file.uploadFolder=d://uploadFiles/ #特别要注意此位置
配置完成之后,项目重新启动。重新进行上传。
上传之后的,会立即显示出来。
同时请注意查看你的磁盘中文件是否保存进去,
此时就成功上传保存了文件。 有问题可以评论,帮助解决,如果有更好的方案,可以进行探讨。谢谢