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();
            // 把文件的名称设置唯一值,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();
}
}

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值