之前做学校的项目需要用到图片上传功能,项目比较小就只用到springboot+mybatis框架,在网上找了很长时间的springboot图片上传功能,一直都没有找到,并不是说找到的demo不行,而是demo太多了,找不到适合这种小项目的。
在坚持不懈的找demo中找到了一个作者的demo完美适合我的校内项目,在这里我就在完善一下原作者的demo.顺便感谢一下原作者。
原作者 https://www.cnblogs.com/LULULI/p/10571517.html
代码:
一.application.properties配置
#图片上传配置
#是否启用文件上传功能
spring.servlet.multipart.enabled=true
#指定文件的位置, 没有指定时会自动创建一个临时文件夹
spring.servlet.multipart.location=D:/git-depository/upload
#指定上传文件大小, 默认1M
spring.servlet.multipart.max-file-size=20MB
#指定multipart / form-data请求允许的最大大小, 默认10M
spring.servlet.multipart.max-request-size=20MB
#图片上传路径映射 自定义属性
upload.picture.path=D:/git-depository/upload
二.三个工具类
FileNameUtil
//生成新的文件名
public class FileNameUtil {
/**
* 获取文件后缀
* @param fileName
* @return
*/
public static String getSuffix(String fileName){
return fileName.substring(fileName.lastIndexOf("."));
}
/**
* 生成新的文件名
* @param fileOriginName 源文件名
* @return
*/
public static String getFileName(String fileOriginName){
return UUIDUtils.getUUID() + FileNameUtil.getSuffix(fileOriginName);
}
}
FileUploadUtil
这里需要导入的三个包
import java.io.File;
import java.io.IOException;
import org.springframework.web.multipart.MultipartFile;
multipart.MultipartFile感兴趣的小伙伴可以去看看。
public class FileUploadUtil {
/**
*
* @param file 文件
* @param path 文件存放路径
* @param fileName 原文件名
* @return
*/
public static boolean upload(MultipartFile file, String path, String fileName) {
// 生成新的文件名
String realPath = path + "/" +fileName;
//使用原文件名
// String realPath = path + "/" + fileName;
File dest = new File(realPath);
//判断文件父目录是否存在
if(!dest.getParentFile().exists()){
dest.getParentFile().mkdir();
}
try {
//保存文件
file.transferTo(dest);
return true;
} catch (IllegalStateException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
}
UUIDUtils
//使用UUID来对图片名称进行重新生成。
public class UUIDUtils {
public static String getUUID(){
return UUID.randomUUID().toString().replace("-", "");
}
}
一个配置类
UploadFileConfig
记得加上@Configuration注解。
这个主要是用来给图片一个虚拟路径,将虚拟路径映射到此图片存放位置。
@Configuration
public class UploadFileConfig extends WebMvcConfigurationSupport {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/images/**").addResourceLocations("D:/git-depository/upload");
super.addResourceHandlers(registry);
}
}
PhotoController
这里需要去添加springfox-swagger2依赖包,否则 @ApiOperation,@ApiImplicitParam注解无法使用。
怕有些小伙伴没copy懂,jsonutil自己写的一个工具类,用来返还url给前端。
@Controller
public class PhotoController {
@ApiOperation("图片上传")
@ApiImplicitParam(name = "file", value = "文件", required = true, dataType = "File")
@RequestMapping("/upload")
@ResponseBody
public JSONObject upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
JSONUtil jsonUtil=new JSONUtil();
//定义要上传文件 的存放路径
String localPath="D:/git-depository/upload";
//获得文件名字
String fileName=file.getOriginalFilename();
//文件名=localpath+fileName
File dest = new File(localPath + fileName);
if(FileUploadUtil.upload(file, localPath, fileName)){
// 将上传的文件写入到服务器端文件夹
// 获取当前项目的完整url
String requestURL = request.getRequestURL().toString();
// 获取当前项目的请求路径url
String requestURI = request.getRequestURI();
// 得到去掉了uri的路径
String url = requestURL.substring(0, requestURL.length()-requestURI.length() + 1);
url= localPath+fileName;
return jsonUtil.success(url);
}
return jsonUtil.fail("未知错误");
}
}
大概就这样,直接cv过去就能用的简单明了。
测试:.
在head把Content-Type勾去掉
这是后端的,前端怎么用改天在写了。