springboot上传文件并返回url过程

 更新时间:2022年11月17日 08:36:06   作者:明明joy  
这篇文章主要介绍了springboot上传文件并返回url过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springboot上传文件并返回url

1.首先在yml中配置文件上传地址 

2.文件保存本地没有配置在服务器上 需要多写一个api,在上传的最后生成一个url

直接上代码

@Slf4j
@Service
public class StuEmailPhotoServiceImpl implements StuEmailPhotoService {
 
    @Value("${file.email_img_url}")
    String imageUrl;
    @Value("${img.url}")
    String imgUrl;
    @Resource
    StuEmailPhotoMapper stuEmailPhotoMapper;
 
    /**
     * 邮件上传图片
     *
     * @param classId
     * @param file
     * @param request
     * @return
     */
    @Override
    public ResultImg batchUpload(Long classId, MultipartFile file, HttpServletRequest request) {
 
        if (null == file) {
            return new ResultImg(ResultInfo.FAIL_CODE, "传入文件为空!");
        }
        String errMsg = null;
        String newName = null;
        try {
            String oldName = file.getOriginalFilename().toLowerCase();  //获取图片的名称
            String imgPath = null;
            newName = classId + "-emailTemplate-" + UUID.randomUUID() + oldName.substring(oldName.lastIndexOf("."));
            imgPath = imageUrl + classId; // + "/" + newName
            File folder = new File(imgPath);
            //没有文件夹就创建
            if (!folder.exists()) {
                folder.mkdirs();
            }
 
            //压缩图片再保存outputQuality(1f) 越接近1,图片质量越高
            String suffix = oldName.substring(oldName.lastIndexOf(".") + 1);
            Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(1f).outputFormat(suffix).toFile(new File(folder, newName));
 
            //存储图片信息
            StuEmailPhoto stuEmailPhoto = new StuEmailPhoto();
            stuEmailPhoto.setClassId(classId);
            stuEmailPhoto.setImgOname(oldName);
            stuEmailPhoto.setImgName(newName);
            stuEmailPhoto.setImgUrl(imgPath + "/" + newName);
            stuEmailPhoto.setCreateTime(DateFormatUtils.getCurrentTime());
            stuEmailPhoto.setCreator(SecurityUtils.getCurrentUserId());
            stuEmailPhotoMapper.insert(stuEmailPhoto);
 
        } catch (Exception e) {
            errMsg = e.getLocalizedMessage();
            log.error("------StuPlatTrans--------batchUpload-----------:" + e);
        }
        if (StringUtils.isNotEmpty(errMsg)) {
            return new ResultImg(ResultInfo.FAIL_CODE, errMsg);
        }
 
        String url = imgUrl + "api/selectData/readImageView/emailTemplate/" + classId + "/" + newName;
        ImgUrl imgUrl = new ImgUrl();
        imgUrl.setUrl(url);
        List<ImgUrl> urlList = new ArrayList();
        urlList.add(imgUrl);
        return new ResultImg(0, urlList);
    }
 
    /**
     * 浏览器读取图片
     *
     * @param classId
     * @param imgName
     * @param request
     * @param response
     */
    @Override
    public void readImageView(Long classId, String imgName, HttpServletRequest request, HttpServletResponse response) {
        log.info("----------调用邮箱readImageView方法---------------");
 
        ServletOutputStream outputStream = null;
        FileInputStream inputStream = null;
 
        try {
            //获取图片存放路径
            String imgPath = null;
            StuEmailPhoto stuEmailPhoto = stuEmailPhotoMapper.getUrlByNameAndClassId(classId, imgName);
            imgName = stuEmailPhoto.getImgName();
            String suffix = imgName.substring(imgName.lastIndexOf(".") + 1);
//            StuPlatTransfer transfer = transferMapper.getImageUrlByName(java.net.URLDecoder.decode(imgName, "utf-8") );
            log.info(JsonHelper.toJsonString(stuEmailPhoto));
            imgPath = stuEmailPhoto.getImgUrl();
            if (null != imgPath) {
                File imgFile = new File(imgPath);
                if (!imgFile.exists()) {
                    return;
                }
//                response.setContentType("application/octet-stream; charset=utf-8");
                response.addHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
                response.addHeader("Access-Control-Expose-Headers", "token,uid,Content-Disposition");
                response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
                response.addHeader("Access-Control-Allow-Headers", "Content-Type");
                response.addHeader("Access-Control-Allow-Credentials", "true");
                response.addHeader("Content-Length", "" + imgFile.length());
                response.setHeader("Pragma", "no-cache");
                response.setHeader("Cache-Control", "no-cache");
                response.setDateHeader("Expires", 0);
 
                inputStream = new FileInputStream(imgFile);
                response.setContentType("image/" + suffix + ";charset=utf-8");
                outputStream = response.getOutputStream();
                //读取文件流
                int len = 0;
                byte[] buffer = new byte[1024 * 10];
                while ((len = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, len);
                }
                outputStream.flush();
            }
 
        } catch (Exception e) {
            log.error("-----readImageView---imageName--" + imgName + "--err:" + e);
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                log.error("-----readImageView---input close--" + imgName + "--e:" + e);
            }
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                log.error("-----readImageView---out close--" + imgName + "--e:" + e);
            }
        }
    }
}

springboot上传文件两种方式

1.文件保存在服务器,url地址保存在数据库

	/**
	 * 1.文件保存在服务器,url地址保存在数据库
     * 上传成功之后返回成功保存的url地址
     */
@PostMapping("/upload")
    public @ResponseBody String upload(@RequestParam MultipartFile file, HttpServletRequest request){
        if(!file.isEmpty()){
            String uploadPath = "C:\uploadFile";
            // 如果目录不存在则创建
            File uploadDir = new File(uploadPath);
            if (!uploadDir.exists()) {
                uploadDir.mkdir();
            }
            String OriginalFilename = file.getOriginalFilename();//获取原文件名
            String suffixName = OriginalFilename.substring(OriginalFilename.lastIndexOf("."));//获取文件后缀名
            //重新随机生成名字
            String filename = UUID.randomUUID().toString() +suffixName;
            File localFile = new File(uploadPath+"\"+filename);
            try {
                file.transferTo(localFile); //把上传的文件保存至本地
                /**
                 * 这里应该把filename保存到数据库,供前端访问时使用
                 */
                return filename;//上传成功,返回保存的文件地址
            }catch (IOException e){
                e.printStackTrace();
                System.out.println("上传失败");
                return "";
            }
        }else{
            System.out.println("文件为空");
            return "";
        }
    }

2.直接把文件以二进制形式保存到数据库中数据类型为blob的一个字段

/**
*上传图片,使用mybatis-plus保存到数据库
*User为实体类,数据库对应user表,有id、image两个属性
*/
@PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("file") MultipartFile file) throws Exception{
        if(!file.isEmpty()){
            User user=new User();
            user.setImage(file.getBytes());
            userMapper.insert(user);
        }
        return "ok";
    }
/**
*前端通过id获取数据库中的图片
*/
    @GetMapping("/getImage")
    @ResponseBody
    public void getImage(String id,HttpServletResponse resp) throws Exception{
        User user=userMapper.selectById(id);
        byte[] image = (byte[])user.getImage();
        resp.setContentType("image/jpeg");
        ServletOutputStream out = resp.getOutputStream();
        out.write(image);
        out.flush();
        out.close();
    }

3.前端代码

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" /><br/>
    <input type="submit" name="" id="" value="提交" />
</form>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中的interrupt、interrupted和isInterrupted方法区别详解

    Java中的interrupt、interrupted和isInterrupted方法区别详解

    这篇文章主要介绍了Java中的interrupt、interrupted和isInterrupted方法区别详解,interrupt用于中断线程,调用该方法的线程的状态将会被设置为中断状态,线程中断仅仅是设置线程的中断状态位,并不会停止线程,需要用户自己去监视线程的状态并作出处理,需要的朋友可以参考下
    2023-12-12
  • Java后台防止客户端重复请求、提交表单实现原理

    Java后台防止客户端重复请求、提交表单实现原理

    这篇文章主要介绍了Java后台防止客户端重复请求、提交表单实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 解决feign接口返回泛型设置属性为null的问题

    解决feign接口返回泛型设置属性为null的问题

    这篇文章主要介绍了解决feign接口返回泛型设置属性为null的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java将集合List转换成String字符串(或String转换成List)详解

    Java将集合List转换成String字符串(或String转换成List)详解

    今天在写项目的时候遇到一个问题,就是要把得到的一个集合转换成字符串,下面这篇文章主要给大家介绍了关于Java将集合List转换成String字符串(或String转换成List)的相关资料,需要的朋友可以参考下
    2023-06-06
  • 深入理解SpringBoot中关于Mybatis使用方法

    深入理解SpringBoot中关于Mybatis使用方法

    这篇文章主要介绍了SpringBoot中关于Mybatis使用方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-03-03
  • ElasticSearch的安装与基本概念

    ElasticSearch的安装与基本概念

    这篇文章主要介绍了ElasticSearch的安装与基本概念,提供了一个分布式多用户能力的全文搜索引擎,Elasticsearch是用Java开发的,需要的朋友可以参考下
    2023-04-04
  • Java使用正则表达式验证用户名和密码的方法

    Java使用正则表达式验证用户名和密码的方法

    这篇文章主要介绍了Java使用正则表达式验证用户名和密码的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • SpringBoot集成Beetl后统一处理页面异常的方法

    SpringBoot集成Beetl后统一处理页面异常的方法

    这篇文章主要介绍了SpringBoot集成Beetl后统一处理页面异常的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Spring jpa和mybatis整合遇到的问题解析

    Spring jpa和mybatis整合遇到的问题解析

    有朋友说jpa相比mybatis太难用,多表联合的查询写起来也比较费劲,所以便加入了mybatis的支持,在配置jpa时遇到各种问题,需要修改相关配置文件,下面小编给大家分享下修改配置文件的思路,感兴趣的朋友参考下
    2016-10-10
  • JAVA实现通用日志记录方法

    JAVA实现通用日志记录方法

    本篇文章主要介绍了JAVA实现通用日志记录方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论