============= 后端_上传图片 ============= 1 为什么要上传图片? Markdown中的图片如下所示: ![image-20220402121530500](C:/Users/Administrator/Pictures/image-20220402121530500.png) 如此形式图片信息,其中使用的是本地图片文件的存储路径。这样的图片无法在浏览器中显式。 前端可以借助Markdown编辑器的图片上传功能先将图片上传到服务器,再在文档中引用服务器上的图片。 _____________________________________ | B | I | H | U | S | ... | ^ | ... | |-------------------------------------| | | ... | | | | 图片上传| | | |_________| | | | | | | | | | | | | | | | |_____________________________________| 2 图片上传到哪里? __________ __________ |应用服务器|图片 | | | YSDBLOG |---->|图片服务器| |__________| |__________| ^ ^ \________ | Markdown| |图片 Markdown| |图片 ___|__|___ ___v__v___ | | | | | 浏览器 | | 浏览器 | |__________| |__________| 图片服务器选用免费的七牛云服务器。 3 七牛云 3.1 创建存储空间 https://www.qiniu.com/ 注册/登录(13552654195/qgahome1974523_Mw) 存储空间 新建空间 存储空间名称:ysdblog 测试域名:r9pf5g3xy.hb-bkt.clouddn.com 个人中心 密钥管理 AK:QlER5nOExJbt8KP4_hMrBXjmDI29YfCDz_bb71ki SK:jBqgFA9AgGa466Pan76Dl6EdFzc7Kyopa9rpEH6P 3.2 添加依赖 /pom.xml: com.qiniu qiniu-java-sdk [7.7.0, 7.7.99] /ysdblog-api/pom.xml: com.qiniu qiniu-java-sdk 3.3 创建工具类 /ysdblog-api/src/main/java/com/weihome/ysdblog/utils/QiniuUtils.java: @Component public class QiniuUtils { public static final String url = "r9pf5g3xy.hb-bkt.clouddn.com"; private static final String accessKey = "QlER5nOExJbt8KP4_hMrBXjmDI29YfCDz_bb71ki"; private static final String secretKey = "jBqgFA9AgGa466Pan76Dl6EdFzc7Kyopa9rpEH6P"; private static final String bucket = "ysdblog"; public boolean upload( MultipartFile multipartFile, String filename) { Configuration configuration = new Configuration(Region.huabei()); UploadManager uploadManager = new UploadManager(configuration); try { byte[] bytes = multipartFile.getBytes(); Auth auth = Auth.create(accessKey, secretKey); String token = auth.uploadToken(bucket); uploadManager.put(bytes, filename, token); } catch (Exception e) { e.printStackTrace(); return false; } return true; } } 4 图片控制器 /ysdblog-api/src/main/java/com/weihome/ysdblog/controller/PictureController.java: @RestController @RequestMapping("picture") public class PictureController { @Autowired private QiniuUtils qiniuUtils; @PostMapping("upload") public Result upload( @RequestParam("image") MultipartFile multipartFile) { // 来自客户端的原始文件名 String filename = multipartFile.getOriginalFilename(); // 由UUID和原始文件名中的扩展名组合而成的服务器使用的文件名 filename = UUID.randomUUID().toString() + "." + StringUtils.substringAfterLast(filename, "."); // 上传文件到七牛云服务器 if (!qiniuUtils.upload(multipartFile, filename)) return Result.fail( ErrorCode.UPLOAD_ERROR.getCode(), ErrorCode.UPLOAD_ERROR.getMsg()); return Result.success(QiniuUtils.url + filename); } } 5 添加配置 Spring默认上传文件不能超过1M字节,如果上传的图片比较大,需要显式配置。 /ysdblog-api/src/main/resources/application.properties: ... # 所有上传(图片)文件的字节数之和不能超过 spring.servlet.multipart.max-request-size=100MB # 每个上传(图片)文件的字节数不能超过 spring.servlet.multipart.max-file-size=10MB ... 6 运行测试 Postman POST localhost:8888/picture/upload Body form-data image(file): IMG_4348.JPG ------------------------------------- { "success": true, "code": 200, "msg": "success", "data": "r9pf5g3xy.hb-bkt.clouddn.com/89f36958-c0ed-42f6-bbfe-3cfaa76fa272.JPG" } 浏览器打开: http://r9pf5g3xy.hb-bkt.clouddn.com/89f36958-c0ed-42f6-bbfe-3cfaa76fa272.JPG 欣赏英俊的我。。。