1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Springboot项目上传图片文件并存入指定目录

Springboot项目上传图片文件并存入指定目录

时间:2018-10-18 11:10:36

相关推荐

Springboot项目上传图片文件并存入指定目录

一 .上传图片到指定目录

/*** 测试文件上传*/@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();// 把文件的名称设置唯一值,uuidString 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 -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();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。