返回

Ant Design 上传图片至阿里云OSS 的探索之路

见解分享

探索图片上传的强大组合:Ant Design 与阿里云 OSS

简介

在现代 Web 开发中,高效且可靠的文件上传解决方案至关重要。通过将 Ant Design 的优雅界面和阿里云 OSS 的强大存储功能相结合,我们可以打造卓越的图片上传体验。本文将深入探讨这些强大技术的整合,从初始设置到高级技巧,全面指导您完成图片上传之旅。

初始设置

1. 安装依赖项

npm install antd @ant-design/icons

2. 引入组件

import { Upload, Icon, Modal } from 'antd';

3. 获取阿里云 OSS 凭证

从阿里云控制台获取 AccessKey ID 和 AccessKey Secret。

4. 创建 Upload 组件

const MyUpload = () => {
  // 状态管理
  const [loading, setLoading] = useState(false);
  const [fileList, setFileList] = useState([]);
  const [previewImage, setPreviewImage] = useState('');
  const [previewVisible, setPreviewVisible] = useState(false);

  // 预览图片
  const handlePreview = (file) => {
    setPreviewImage(file.url || file.thumbUrl);
    setPreviewVisible(true);
  };

  // 文件列表变化
  const handleChange = ({ fileList }) => setFileList(fileList);

  // 渲染
  return (
    <>
      <Upload
        action="https://example.com/upload"
        listType="picture"
        fileList={fileList}
        onPreview={handlePreview}
        onChange={handleChange}
      >
        <Button icon={<Icon type="upload" />}>选择图片</Button>
      </Upload>
      <Modal visible={previewVisible} footer={null} onCancel={() => setPreviewVisible(false)}>
        <img alt="example" style={{ width: '100%' }} src={previewImage} />
      </Modal>
    </>
  );
};

高级技巧

1. 配置阿里云 OSS 凭证

const STS_API = 'https://sts.aliyuncs.com';
const region = 'oss-cn-shenzhen';
const bucketName = 'my-bucket';

const fetchCredentials = async () => {
  const data = await fetch(`${STS_API}?Action=AssumeRole&RoleArn=...&RoleSessionName=...`, {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
    },
  }).then((res) => res.json());

  const { Credentials } = data;
  return {
    accessKeyId: Credentials.AccessKeyId,
    accessKeySecret: Credentials.AccessKeySecret,
    securityToken: Credentials.SecurityToken,
    region: region,
    bucketName: bucketName,
  };
};

2. 使用自定义请求头

const customRequest = ({ action, data, file, filename, headers, onProgress }) => {
  const { accessKeyId, accessKeySecret, securityToken } = await fetchCredentials();

  headers['x-oss-security-token'] = securityToken;

  const formData = new FormData();
  formData.append('key', file.uid);
  formData.append('OSSAccessKeyId', accessKeyId);
  formData.append('policy', policy);
  formData.append('signature', signature);
  formData.append('success_action_status', '200');
  formData.append('file', file);

  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.onload = () => {
      if (xhr.status < 200 || xhr.status >= 300) {
        reject(new Error(xhr.statusText));
        return;
      }

      const result = JSON.parse(xhr.response);
      resolve(result);
    };

    xhr.onerror = (e) => {
      reject(e);
    };

    xhr.upload.onprogress = (e) => {
      onProgress({ percent: e.loaded / e.total * 100 });
    };

    xhr.open('POST', action, true);
    xhr.setRequestHeader('Content-Type', 'multipart/form-data');
    for (const key in headers) {
      if (headers.hasOwnProperty(key)) {
        xhr.setRequestHeader(key, headers[key]);
      }
    }
    xhr.send(formData);
  });
};

3. 自定义文件名称

const filename = (file) => {
  const time = new Date();
  return `${time.getFullYear()}-${time.getMonth() + 1}-${time.getDate()}-${time.getHours()}-${time.getMinutes()}-${time.getSeconds()}-${file.name}`;
};

结论

Ant Design 和阿里云 OSS 的结合为我们提供了打造图片上传解决方案的强大工具。本文详细介绍了从初始设置到高级技巧的整个流程,使您能够轻松创建高效且可靠的文件上传功能。无论您是 Web 开发新手还是经验丰富的专业人士,本指南都将为您提供必要的知识和指导,帮助您掌握图片上传的艺术。

常见问题解答

  1. 如何使用 Ant Design 的 Upload 组件?
    参考本文提供的代码示例,创建 Upload 组件并配置其属性。

  2. 如何获取阿里云 OSS 凭证?
    从阿里云控制台的凭证管理页面获取 AccessKey ID 和 AccessKey Secret。

  3. 如何使用自定义请求头?
    使用自定义请求头函数替换 Upload 组件的 request 属性。

  4. 如何自定义文件名称?
    使用自定义 filename 函数替换 Upload 组件的 filename 属性。

  5. 如何处理图片预览?
    使用 onPreview 属性,在 Modal 中预览选定的图片。