一 .上传图片到指定目录
/**
* 测试文件上传
*/
@RequestMapping("/testFileUpload")
public R testFileUpload(@RequestParam MultipartFile upload, HttpServletRequest request) throws Exception{
//上传文件的位置,默认会在项目根目录找static文件夹,需手动创建,不然找到是临时路径。
String path = request.getSession().getServletContext().getRealPath("/uploads/");
//判断该路径是否存在
File file = new File(path);
// 若不存在则创建该文件夹
if(!file.exists()){
file.mkdirs();
}
//获取上传文件的后缀名
String fileType =upload.getOriginalFilename().substring(upload.getOriginalFilename().indexOf("."));
// 获取上传文件的名称
//String filename = upload.getOriginalFilename();
// 把文件的名称设置唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
String filename = uuid+fileType;
// todo 把文件名存入数据库(此步骤省略)
// 完成文件上传
try {
upload.transferTo(new File(path,filename));
} catch (Exception e) {
e.printStackTrace();
}
return R.ok();
}
postman 测试
遇到的问题
默认情况下springboot中request.getServletContext().getRealPath(“/”)获取的是一个临时文件夹的地址
C:\Users\kwhua\AppData\Local\Temp\tomcat-docbase.6560870977547015292.8888\
查看源码可知
org.springframework.boot.context.embedded.AbstractEmbeddedServletContainerFactory类中的方法
private File getCommonDocumentRoot() {
for (String commonDocRoot : COMMON_DOC_ROOTS) {
File root = new File(commonDocRoot);
if (root.exists() && root.isDirectory()) {
return root.getAbsoluteFile();
}
}
return null;
}
private static final String[] COMMON_DOC_ROOTS = { "src/main/webapp", "public",
"static" };
可以看到springboot 会尝试读取COMMON_DOC_ROOTS 配置里面的路径,所以我们只需要在springboot 所在的jar 或者项目所在的根目录下新建一个public或者static的文件夹,那么通过request.getServletContext().getRealPath() 就会得到public或者static的路径
二.将图片以字节数组格式存入数据库
mysql字段类型
实体类字段格式
private byte[] devicesImages;
public byte[] getDevicesImages() {
return devicesImages;
}
public void setDevicesImages(byte[] devicesImages) {
this.devicesImages = devicesImages;
}
逻辑代码
/**
* 将图片以字节数组的方式存入mysql
*/
public void uploadImages(MultipartFile upload, HttpServletRequest request) throws IOException {
InputStream ins = upload.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len=ins.read(buf))!=-1){
bos.write(buf,0,len);
}
bos.flush();
byte data[] = bos.toByteArray();
//todo 数据库的插入操作
}
三.记录一个好用的生成文件名的工具类
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
* @author kwhua
* @date 2020-07-06
* 图片名生成工具类
*/
public class CreateImageNameUtil {
public static final String numberChar = "0123456789";
/***
* 使用当前时间+随机数构建图片名
*/
public static String toCreateImageName() {
return getNowDatetoString() + generateNum(10);
}
/***
* 生成日期字符串 yyyyMMddHHmm
*/
public static String getNowDatetoString() {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmm");
String dateString = formatter.format(currentTime);
return dateString;
}
/***
* 生成随机数
* @param len
* @return
*/
public static String generateNum(int len) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < len; i++) {
sb.append(numberChar.charAt(random.nextInt(numberChar.length())));
}
return sb.toString();
}
}