SpringBoot文件上传代码迭代及图片回传实现

概述

在使用SpringBoot进行文件上传的时候,一般都会按照如下代码进行,如果没有思路的话,底部有一文章连接,可以参考,如下代码倒是可以实现功能了,但是你会看着有一点乱,我们的想法是迭代一下,让代码更加清晰

	
	private final static String fileStorePath = FileInfoController.class.getResource("/").getPath()
                + "static" +File.separator +"files";
	
	@PostMapping
    public ResponseEntity changeHeadImg(@RequestParam MultipartFile files, HttpServletRequest request){

        /*
            1.图片转存
            2.路径返回
         */
		
		//获取文件后缀名
        String filename = files.getOriginalFilename();
        String suffix = filename.substring(filename.lastIndexOf("."));
        String imgname = System.currentTimeMillis()+suffix;
		
		// url诸如 2020/10/12
        String url = File.separator
                +LocalDate.now().getYear()
                +File.separator
                +LocalDate.now().getMonthValue()
                +File.separator
                +LocalDate.now().getDayOfMonth()
                +File.separator
                ;
		
		//imgUrl 诸如 2020/10/12/dafdfgeqw.jpg
        String imgUrl = url + imgname;
		
		//path 诸如 d:/2020/10/12/dafdfgeqw.jpg
        String path = fileStorePath+imgUrl;
		
        File fileStore = new File(fileStorePath+url);

        if (!fileStore.exists()){
            fileStore.mkdirs();
        }

        try {
            files.transferTo(new File(path));
        } catch (IOException e) {
            log.info("无法保存用户头像");
            e.printStackTrace();
        }

        FileInfo fileInfo = new FileInfo();
        fileInfo.setContentType(request.getContentType());
        fileInfo.setSize(files.getSize());
        fileInfo.setPath(path);
        fileInfo.setUrl(imgUrl);
        fileInfo.setType(1);
        fileInfo.setCreateTime(LocalDateTime.now());
        fileInfo.setUpdateTime(LocalDateTime.now());
		
		//写入到数据库并保存
        fileInfoService.save(fileInfo);

        return new ResponseEntity(HttpStatus.OK);
    }

迭代

迭代的总体思路是,把一些变量抽取出来,一些路上上的变量抽出来成为一个函数,方便公用

	private final static String fileStorePath = FileInfoController.class.getResource("/").getPath()
                + "static" +File.separator +"files";

    @Override
    @Transactional
    public MytryFileInfo upload(MultipartFile file) throws IOException {
		
		/*
		因为文件的后缀名就使用次数不多,单独写一个变量显得有点多余,
		于是就直接通过MultipartFile中直接获取了,这样显得代码比较清晰
		*/
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
		
		//原来的url抽取成为了一个 getPath函数,可以看到到处都是getPath函数,更加清晰了
        String url =  getPath()+System.currentTimeMillis()+suffix;

        File fileStore = new File(fileStorePath,getPath());

        if (!fileStore.exists()){
            fileStore.mkdirs();
        }

        file.transferTo(new File(fileStorePath,url));

        MytryFileInfo mytryFileInfo = new MytryFileInfo();
        mytryFileInfo.setPath(fileStorePath+url);
        mytryFileInfo.setUrl(url);
        //文件类型
        mytryFileInfo.setType("1");
        mytryFileInfo.setUserId(UserUtil.getCurrentUser().getId());

        mytryFileInfoDao.insert(mytryFileInfo);

        return mytryFileInfo;
    }

    private String getPath(){

        return File.separator + LocalDate.now().toString().replace("-",File.separator) + File.separator;

    }

如下文章,比较适合刚开始练习文件上传
文件上传

图片回传

我们需要实现的效果如下图,这时候,你可以发现的是url处回传了一个图片,如何实现的呐?
在这里插入图片描述
说一下思路吧

用户上传图片,我们把图片存储在resources下,前端发起ajax请求的时候,根据前端的url在resources下读取、展现数据
在这里插入图片描述

前端根据url发起如下请求:

http://localhost:9003/files/2021/02/20/1613806958282.png

resource下的图片数据如下:
在这里插入图片描述
代码即为迭代处的代码,需要注意的一点是用代码进行数据回传的时候,上传的图片及创建的目录不会直接展现在resouces下,而是呈现在/target/classes中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值