springboot 实现图片上传功能

这几天在做重构学校的图书馆项目,用sprinboot重新搭建项目,原项目是使用PHP搭建的,刚开始看着挺懵的,慢慢的就看懂。这个项目中遇到的难题是照片上传功能,弄了挺久才实现出来。

此功能没有导入如何jar包。

这里介绍呢,我就按照项目本身的结构来实现这个功能。

首先是数据库的数据结构,项目先是通过照片名(xxx.jpg)保存到数据库(picurl).
故我的想法是通过新书的名字,获取到这个新书对应的照片名,进行对上传上的照片进行名字的修改。

1.Mapper层

 <!--上传图片--><select id="changeAvatar" resultType="NewBooks">select * from newbooks where title=#{title}</select>

2.Service层

@Override
public NewBooks changePicUrl(String title) {//根据参数调用方法NewBooks newBooks = newBooksMapper.changeAvatar(title);if (newBooks == null){throw new NewsBookNotException("书库没有该书数据,请先添加!");}return newBooks;
}

3.自定义异常

3.1service层自定义异常

为了便于统一管理自定义异常,在service包中创一个ex包用来放自定义异常的基类异常,继承自RuntimeException类,并从父类生成子类的五个构造方法。
创建NewsBookNotException类,当用户输入到的书名,在数据库中没有找到数据,则会出对应的信息。

3.2 上传文件自定义异常

处理异常

1.在处理上传文件的过程中,用户可能会选择错误的文件上传,此时就应该抛出对应的异常并进行处理。所以需要创建文件上传相关异常的基类,即在com.cy.store.controller.ex包下创建FileUploadException类,并继承自RuntimeException类。

package com.pzlib.service.ex;/** 文件上传相关异常的基类 */
public class FileUploadException extends RuntimeException {public FileUploadException() {super();}public FileUploadException(String message) {super(message);}public FileUploadException(String message, Throwable cause) {super(message, cause);}public FileUploadException(Throwable cause) {super(cause);}protected FileUploadException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

2.在处理上传的文件过程中,经分析可能会产生以下异常。这些异常类都需要继承自FileUploadException类。

// 上传的文件为空
controller.ex.FileEmptyException
// 上传的文件大小超出了限制值
controller.ex.FileSizeException
// 上传的文件类型超出了限制
controller.ex.FileTypeException
// 上传的文件状态异常
controller.ex.FileStateException
// 上传文件时读写异常
controller.ex.FileUploadIOException

3.创建FileEmptyException异常类,并继承FileUploadException类。

package com.pzlib.service.ex;/** 上传的文件为空的异常,例如没有选择上传的文件就提交了表单,或选择的文件是0字节的空文件 */
public class FileEmptyException extends FileUploadException {// Override Methods...
}

4.创建FileSizeException异常类,并继承FileUploadException类。

package com.pzlib.service.ex;/** 上传的文件的大小超出了限制值 */public class FileSizeException extends FileUploadException {// Override Methods...
}

5.创建FileTypeException异常类,并继承FileUploadException类。

package com.pzlib.service.ex;
/** 上传的文件类型超出了限制 */
public class FileTypeException extends FileUploadException {// Override Methods...
}

6.创建FileStateException异常类,并继承FileUploadException类。

package com.pzlib.service.ex;/** 上传的文件状态异常 */
public class FileStateException extends FileUploadException {// Override Methods...
}

7.创建FileUploadIOException异常类,并继承FileUploadException类。

package com.pzlib.service.ex;/** 上传文件时读写异常 */
public class FileUploadIOException extends FileUploadException {// Override Methods...
}

8.然后在BaseController的handleException()的@ExceptionHandler注解中添加FileUploadException.class异常的处理;最后在方法中处理这些异常。

@ExceptionHandler({ServiceException.class, FileUploadException.class})
public JsonResult<Void> handleException(Throwable e) {JsonResult<Void> result = new JsonResult<Void>(e);if (e instanceof UsernameDuplicateException) {result.setState(4000);} else if (e instanceof UserNotFoundException) {result.setState(4001);} else if (e instanceof PasswordNotMatchException) {result.setState(4002);} else if (e instanceof InsertException) {result.setState(5000);} else if (e instanceof UpdateException) {result.setState(5001);} else if (e instanceof FileEmptyException) {result.setState(6000);} else if (e instanceof FileSizeException) {result.setState(6001);} else if (e instanceof FileTypeException) {result.setState(6002);} else if (e instanceof FileStateException) {result.setState(6003);} else if (e instanceof FileUploadIOException) {result.setState(6004);}return result;
}

4.BaseController层

package com.pzlib.controller;import com.pzlib.controller.ex.*;
import com.pzlib.service.ex.*;
import com.pzlib.util.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;/** 控制器类的基类 */
public class BaseController {/** 操作成功的状态码 */public static final int OK = 200;/** @ExceptionHandler用于统一处理方法抛出的异常 */@ExceptionHandler({ServiceException.class,FileUploadException.class})public JsonResult<Void> handleException(Throwable e) {JsonResult<Void> result = new JsonResult<Void>(e);if (e instanceof UsernameDuplicateException) {result.setState(4000);} else if (e instanceof UserNotFoundException) {result.setState(4001);} else if (e instanceof PasswordNotMatchException) {result.setState(4002);} else if (e instanceof NewsBookNotException) {result.setState(4003);}else if (e instanceof UpdateException) {result.setState(5001);}else if (e instanceof InsertException) {result.setState(5002);}else if (e instanceof SelectException) {result.setState(5003);}else if (e instanceof DeleteException) {result.setState(5004);}else if (e instanceof FileEmptyException) {result.setState(6000);} else if (e instanceof FileSizeException) {result.setState(6001);} else if (e instanceof FileTypeException) {result.setState(6002);} else if (e instanceof FileStateException) {result.setState(6003);} else if (e instanceof FileUploadIOException) {result.setState(6004);}return result;}
}
5.FileUrlController

自定义了异常,需要FileUrlController类继承BaseController类,捕获到异常信息。

package com.pzlib.controller;import com.pzlib.controller.ex.*;
import com.pzlib.entity.NewBooks;
import com.pzlib.service.INewsBootService;import com.pzlib.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;@RestController
public class FileUrlController extends BaseController {@Autowiredprivate INewsBootService newsBootService;/** 头像文件大小的上限值(1MB) */public static final int AVATAR_MAX_SIZE = 1 * 1024 * 1024;/** 允许上传的头像的文件类型 */public static final List<String> AVATAR_TYPES = new ArrayList<String>();/** 初始化允许上传的头像的文件类型 */static {AVATAR_TYPES.add("image/jpeg");AVATAR_TYPES.add("image/jpg");AVATAR_TYPES.add("image/png");AVATAR_TYPES.add("image/bmp");AVATAR_TYPES.add("image/gif");AVATAR_TYPES.add("image/pjpeg");AVATAR_TYPES.add("image/x-png");}@PostMapping("/newsImage")public JsonResult<String> newsImage(@RequestParam("file") MultipartFile file,String title) {// 判断上传的文件是否为空if (file.isEmpty()) {// 是:抛出异常throw new FileEmptyException("上传的头像文件不允许为空");}// 判断上传的文件大小是否超出限制值if (file.getSize() > AVATAR_MAX_SIZE) { // getSize():返回文件的大小,以字节为单位// 是:抛出异常throw new FileSizeException("不允许上传超过" + (AVATAR_MAX_SIZE / 1024) + "KB的头像文件");}// 判断上传的文件类型是否超出限制String contentType = file.getContentType();// boolean contains(Object o):当前列表若包含某元素,返回结果为true;若不包含该元素,返回结果为falseif (!AVATAR_TYPES.contains(contentType)) {// 是:抛出异常throw new FileTypeException("不支持使用该类型的文件作为头像,允许的文件类型:" + AVATAR_TYPES);}//获取jar包所在目录ApplicationHome h = new ApplicationHome(getClass());File jarF = h.getSource();//在jar包所在目录下生成一个upload文件夹用来存储上传的图片String parent = jarF.getParentFile().toString()+"/classes/static/images/book/";System.out.println(parent);// 保存头像文件的文件夹File dir = new File(parent);if (!dir.exists()) {dir.mkdirs();}// 保存的头像文件的文件名String suffix = "";String originalFilename = file.getOriginalFilename();int beginIndex = originalFilename.lastIndexOf(".");if (beginIndex > 0) {suffix = originalFilename.substring(beginIndex);}NewBooks newBooks = newsBootService.changePicUrl(title);String string = newBooks.getPicurl();String[] split = string.split("\.");String filename =split[0]+ suffix;// 创建文件对象,表示保存的头像文件File dest = new File(dir, filename);// 执行保存头像文件try {file.transferTo(dest);} catch (IllegalStateException e) {// 抛出异常throw new FileStateException("文件状态异常,可能文件已被移动或删除");} catch (IOException e) {// 抛出异常throw new FileUploadIOException("上传文件时读写错误,请稍后重新尝试");}/*// 头像路径String avatar = "/images/book/" + filename;// 返回成功头像路径*/return new JsonResult<String>(OK);}

运行结果

运行失败:

&图片保存路径是在target/classes/static/images/book/xxx.jpg,

&如果是打包成jar包,则路径和jar路径一样。


如有错误请指正,谢谢!

springboot 实现图片上传功能相关推荐

  1. 菜鸟的springboot项目图片上传及图片路径分析

    菜鸟的springboot项目图片上传及图片路径分析 说明 一.图片路径分析 二.实现图片上传 (1)单文件上传(非异步) (2)单文件上传(异步) 三.总结 四.更新配置文件 说明 更新时间:202 ...

  2. springboot入门系列教程|第九篇:springboot实现图片上传与显示(附源码)

    前言## 上一篇我们介绍了springboot如何实现自定义拦截器配合注解使用,那么这篇我们将介绍springboot实现图片上传的功能. 目录## 文章目录 前言## 目录## 项目创建### 项目 ...

  3. ckeditor java 上传_java使用CKEditor实现图片上传功能

    java如何使用ckeditor实现图片上传功能,具体内容如下 1.根据实际需要下载指定的ckeditor 2.删除文件ckeditor/plugins/image/dialogs/image.js预 ...

  4. 关于微信内置浏览器,打开图片上传功能,调用的问题

    关于微信内置浏览器,打开图片上传功能,调用的问题 前段时间,项目完结测试的时候,同事打开魅族手机测试,无意中发现一个奇葩的问题! 描述: 显示的是文件系统,列表式的,没有调用相机的功能图标,为什么呢? ...

  5. (转)淘淘商城系列——实现图片上传功能

    http://blog.csdn.net/yerenyuan_pku/article/details/72808000 上文我们使用FastDFS-Client进行了简单的文件上传操作测试,淘淘商城项 ...

  6. Smiditor实现图片上传功能

    Simditor 是 Tower 开源的一个基于浏览器所见即所得的文本编辑器. 相比传统的编辑器它的特点是: 功能精简,加载快速 输出格式化的标准 HTML 每一个功能都有非常优秀的使用体验 兼容的主 ...

  7. PHP实现图片上传功能

    PHP实现图片上传功能: 第一个页: picupload.php 代码如下: <form action="picop.php"  method="post" ...

  8. SpringBoot+Thymeleaf图片上传

    SpringBoot+Thymeleaf图片上传 首先需要添加本地图片映射 我是在启动类添加 @SpringBootApplication @MapperScan("com.example. ...

  9. ckfinder php 配置,PHP中Ckeditor+Ckfinder配置图片上传功能_PHP教程

    从标题来看我们知道Ckeditor不支持图片上传功能,它是需要一个组件Ckfinder才可以支持上传图片, 本文章就来详细的介绍了如何配置Ckeditor+Ckfinder实现图片上传的功能. 第一: ...

最新文章

  1. 自学考试计算机实践课,自学考试的计算机实践课怎么考大神们帮帮忙
  2. 验证码的编写——本质:图片目的:防止恶意表单注册
  3. c语言将程序写为动态库,VS下生成C程序静态库(LIB)及动态库(DLL)的方法
  4. 人月神话阅读笔记(二)
  5. Knative Service 之流量灰度和版本管理
  6. 数据库迁移Flyway
  7. 如何用java语言编写小游戏?(一)
  8. APTHunter——Windows安全日志排查好帮手
  9. 使用JAVA向word中插入图片
  10. 戴尔通过F12一次性引导菜单刷新BIOS
  11. 背包问题(旅游记得带零钱)
  12. 数据产品经理之数据准确性及测试必要性
  13. mac下安装iso软件
  14. 【劫持】网页被注入广告
  15. 笃行不怠勾勒人才图,望城区人才工作为高质量发展增添强劲动力
  16. 关于上传资源的最新公告
  17. SCI/ISTP和EI论文检索号IDS number和收录号查询方法
  18. @优秀的你!CSDN高校俱乐部主席招募!
  19. Oralce 11g 恢复 .dmp 文件方法及过程
  20. js中some和every用法

热门文章

  1. 微信小程序开发实战(15):视频组件(video)
  2. 里奥机器人控制app_Mio控制APP-mio机器人控制app1.1.3 安卓版【咪奥机器人控制】-东坡下载...
  3. 在群晖NAS上搭建WordPress动态网站并实现外网访问
  4. STM32F1CAN通讯
  5. 【Linux编程】一、Linux常见指令和权限理解(思维导图总结)
  6. JS逆向瑞数4算法专题一
  7. python判断两个数是否互质_《算法》第一章——判断两个整数是否互质
  8. 华为交换机难点学习:导出配置文件/同步时间
  9. 9.1 多元微分学及应用——多元函数的基本概念
  10. MIT多变量微积分--8.多元函数,等值面,偏导数,切平面逼近