react实现上传图片到阿里云OSS以及问题解决(保姆级)

一、优势

        提高上传速度:前端直传利用了浏览器与 OSS 之间的直接连接,能够充分利用用户的网络带宽。相比之下,后端传递文件时,文件需要经过后端服务器的中转,可能会受到后端服务器网络环境和处理能力的限制,从而影响上传速度。此外,前端直传还可以通过并发上传等方式进一步提高上传效率。

        优化用户体验:由于前端直传能够提高上传速度,用户在上传文件时能够更快地看到上传进度和完成结果,减少等待时间,从而提升用户体验。同时,前端直传可以在前端实现更友好的上传交互,如实时显示上传进度条、支持断点续传等功能,让用户对上传过程有更好的掌控感。

        降低开发成本:使用前端直传可以简化后端代码的编写,减少后端处理文件上传的逻辑和代码量。后端开发人员不需要再处理文件的接收、存储和转发等操作,只需要提供必要的认证和授权信息即可。这有助于降低开发成本,提高开发效率,使开发人员能够更专注于核心业务功能的实现。

        增强系统可扩展性:当系统面临高并发的文件上传需求时,前端直传方式可以更好地应对扩展。因为 OSS 具有良好的扩展性和高可用性,能够自动处理大量的并发上传请求,而不会像后端传递那样受到后端服务器性能的限制。通过前端直传,可以将文件上传的压力分散到 OSS 上,使系统更容易扩展以满足不断增长的业务需求。

二、配置阿里云OSS

1.首先要有一个阿里云账号(搜索对象存储OSS)

2.创建一个bucket

起一个自己的bucket的名称

3.参考文档

找到左下角的SDK下载,我这里是前端应用我就选择了node.js

点击之后能够查看相关的一些配置和使用过程

import OSS from "ali-oss";

const EditUser = () => {
  const [files, setFiles] = useState<FileItem[]>([]);
  const [isUploading, setIsUploading] = useState(false);
  const [previewUrl, setPreviewUrl] = useState(""); 

 // 定义类型
  type FileItem = {
    name: string;
    url: string;
  };

  // OSS 配置常量
  const OSS_CONFIG = {
    accessKeyId: import.meta.env.VITE_OSS_ACCESS_KEY_ID,//你的阿里云秘钥ID
    accessKeySecret: import.meta.env.VITE_OSS_ACCESS_KEY_SECRET,//你的阿里云秘钥密码
    region: import.meta.env.VITE_OSS_REGION,//bucket地域,比如我的是北京就填写‘oss-cn-beijing’
    bucket: import.meta.env.VITE_OSS_BUCKET,//你的bucket名称
    endpoint: import.meta.env.VITE_OSS_ENDPOINT,阿里云域名,类比上方oss-cn-beijing.aliyuncs.com
    secure: true, // 使用 HTTPS
  };


  // 初始化 OSS 客户端
  const client = new OSS(OSS_CONFIG);

  const handleUpload = async (file: File) => {
    if (!file) return;

    try {
      setIsUploading(true);
      const fileName = `${Date.now()}_${file.name}`;
      const result = await client.put(fileName, file);
      const fileUrl = `https://${OSS_CONFIG.bucket}.${OSS_CONFIG.region}.aliyuncs.com/${result.name}`;

      setFiles((prev) => [...prev, { name: file.name, url: fileUrl }]);
      setPreviewUrl(fileUrl);//可访问的云上图片地址
    } catch (error) {
      console.error("文件上传失败:", error);
      message.error("文件上传失败");
    } finally {
      setIsUploading(false);
    }
  };

 const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const file = e.target.files?.[0];
    if (file) {
      handleUpload(file);
    }
    e.target.value = "";
  };

  const triggerFileInput = () => {
    const input = document.createElement("input");
    input.type = "file";
    input.onchange = (e: Event) =>
      handleFileChange(e as unknown as React.ChangeEvent<HTMLInputElement>);
    input.click();
  };

return(
 <div  onClick={triggerFileInput}>
上传文件
       
      </div>
)
}

 这就是一个完整的上传过程

三、配置阿里云秘钥ID和密码

点击头像找到AccessKey

 自己创建一个(建议保存到本地)

四、过程中可能遇到的问题及解决方案

1.秘钥和ID以及名称都写对的情况下出现CORS问题

点击bucket名称进入详情页面

找到跨域设置

按照我这个配置

2.拿到返回的地址之后无法访问照片

依旧在bucket详情里找到公共访问,把阻止公共访问关闭并开启公共读

这样就能正常看到图片了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值