当前位置: 首页 > news >正文

IDEA阿里云OSS实现文件上传·解决苍穹外卖图片回显

简单交代配置阿里云OSS的思路

1. 首先去阿里云开通一个OSS服务,配置好一个自己的Bucket

2. 在IDEA配置Bucket

3. 拷贝官网的OSS工具类代码

package com.sky.utils;import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;/*** 文件上传** @param bytes* @param objectName* @return*/public String upload(byte[] bytes, String objectName) {// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);try {// 创建PutObject请求。ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}//文件访问路径规则 https://BucketName.Endpoint/ObjectNameStringBuilder stringBuilder = new StringBuilder("https://");stringBuilder.append(bucketName).append(".").append(endpoint).append("/").append(objectName);log.info("文件上传到:{}", stringBuilder.toString());return stringBuilder.toString();}
}

4. OSS工具类对象的创建

package com.sky.config;import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 配置类,用于创建AliOssUtil对象*/
@Configuration
@Slf4j
public class OssConfiguration {// 通过参数注入的方式,将Oss的配置信息传递进来// Bean 如果容器中没有AliOssUtil对象,则创建AliOssUtil对象// ConditionalOnBean 表示如果容器中存在AliOssUtil对象,则不创建AliOssUtil对象@Bean@ConditionalOnMissingBeanpublic AliOssUtil aliOssUtil(AliOssProperties aliOssProperties) {log.info("开始创建阿里云文件上传工具类对象:{}",aliOssProperties);// 创建AliOssUtil对象,并传入配置信息return new AliOssUtil(aliOssProperties.getEndpoint(),aliOssProperties.getAccessKeyId(),aliOssProperties.getAccessKeySecret(),aliOssProperties.getBucketName());}
}

5. 在Controller层编写文件上传逻辑

// Autowired注解的作用:自动将匹配的Bean装配到@Autowired标注的变量、方法或构造函数上。(依赖注入)@Autowiredprivate AliOssUtil aliOssUtil;/*** 文件上传* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上传")public Result<String> upload(MultipartFile file) {log.info("文件上传接口被调用:{}",file);String filePath = null;try {//  获取原始文件名String originalFilename = file.getOriginalFilename();// 截取原始文件名的扩展名String extName = originalFilename.substring(originalFilename.lastIndexOf("."));// 生成新的文件名: UUID + 扩展名String newFileName = UUID.randomUUID().toString() + extName;// 文件上传请求路径filePath = aliOssUtil.upload(file.getBytes(), newFileName);}catch(IOException e){e.printStackTrace();log.error("文件上传失败:{}",e);return Result.error(MessageConstant.UPLOAD_FAILED);}return Result.success(filePath);}

6. 测试(省略,做到这里基本无误了)

接下来就来讲讲文件回显失败的几点调试方向

文件回显失败的原因及其排查方向

1. 检查你文件上传拼接的url是否正确

这一步如果错了,实际上上传就已经错了,更别提回显这方面的事情了

2. 首先,如果你全程跟着苍穹老师写的代码去做,必然会导致文件回显失败,我记得视频里面的代码最后是没有返回文件上传路径的,你可以改一下再尝试

具体的,苍穹老师写的文件上传代码:

问题就出在成功的时候还封装了错误的信息进行返回,你应该要把错误的返回放到catch中,成功后把文件路径放到Result中

/*** 文件上传* @param file* @return*/@PostMapping("/upload")@ApiOperation("文件上传")public Result<String> upload(MultipartFile file) {log.info("文件上传接口被调用:{}",file);try {//  获取原始文件名String originalFilename = file.getOriginalFilename();// 截取原始文件名的扩展名String extName = originalFilename.substring(originalFilename.lastIndexOf("."));// 生成新的文件名: UUID + 扩展名String newFileName = UUID.randomUUID().toString() + extName;// 文件上传请求路径String filePath  = aliOssUtil.upload(file.getBytes(), newFileName);}catch(IOException e){e.printStackTrace();log.error("文件上传失败:{}",e);}return Result.error(MessageConstant.UPLOAD_FAILED);}
3. 接着排查OSS,你得允许你的网页可以访问你的OSS对象存储服务之后才可以拿到文件的访问路径,使用OSS必须设置公共读属性

由于我只是练习程序,不想麻烦所以直接设置了公共读写。但是其实最安全的方式还是配置一个防盗链放行你的网页会比较安全

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 华为机考真题 -- 机器人仓库搬砖
  • c++ STL swap用法和实现
  • Spring Cloud Gateway报sun.misc.Unsafe.park(Native Method)
  • 3款自己电脑就可以运行AI LLM的项目
  • AWS无服务器 应用程序开发—第十七章 Application Composer
  • 初识STM32:芯片基本信息
  • 需求分析分类和层级、分析步骤
  • 商品分类左右联动
  • 平凯星辰黄东旭出席 2024 全球数字经济大会 · 开放原子开源数据库生态论坛
  • 安卓逆向经典案例——XX优品(uniapp)
  • 医院门诊预约挂号小程序模板源码
  • 前端JS特效第30波:jquery图片列表按顺序分类排列图片组效果
  • 【MySQL】MySQL连接池原理与简易网站数据流动是如何进行
  • 【计算机组成原理 | 第二篇】计算机硬件架构的发展
  • 【机器学习】基于线性回归的医疗费用预测模型
  • 10个确保微服务与容器安全的最佳实践
  • FastReport在线报表设计器工作原理
  • jquery cookie
  • leetcode388. Longest Absolute File Path
  • miaov-React 最佳入门
  • MySQL的数据类型
  • pdf文件如何在线转换为jpg图片
  • vagrant 添加本地 box 安装 laravel homestead
  • vue 个人积累(使用工具,组件)
  • Vue2.x学习三:事件处理生命周期钩子
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 如何选择开源的机器学习框架?
  • 大数据全解:定义、价值及挑战
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • #include
  • (145)光线追踪距离场柔和阴影
  • (20)docke容器
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (办公)springboot配置aop处理请求.
  • (二)WCF的Binding模型
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (规划)24届春招和25届暑假实习路线准备规划
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (面试必看!)锁策略
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (四)linux文件内容查看
  • (正则)提取页面里的img标签
  • (轉貼) UML中文FAQ (OO) (UML)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 8.0 中有哪些新的变化?
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET/C# 的字符串暂存池