首先咱们的需求大概是这样的,咱们须要使用Antd
的Upload
组件将上传的文件传到七牛云上面,而后让七牛那边返回一个url
便可。node
在进行操做的以前能够先参考一下七牛那边的SDK文档:Node SDK.react
完成需求的流程大概是下面这样:git
这里使用的框架是react
,版本号是16.9.0
。因此这里使用的是函数式组件来进行实现。npm
先安装一波依赖bash
npm install qiniu -S
复制代码
而后新建一个qiniu.js
的文件,用来获得七牛那边的token
值antd
import qiniu from 'qiniu';
import { Qiniu } from '../../secret';
qiniu.conf.ACCESS_KEY = Qiniu.AK;
qiniu.conf.SECRET_KEY = Qiniu.SK;
// 七牛那边的对应的bucket名称
const bucket = '';
export const getToken = () => {
const putPolicy = new qiniu.rs.PutPolicy({
scope: bucket
})
return putPolicy.uploadToken();
}
复制代码
而后相对应的secret.js
用来存储我的七牛的仓库的SK
和AK
。app
其中secret.js
的代码大体为这样(相关的SK和AK填写本身七牛云对应便可):框架
export const Qiniu = {
AK:'',
SK:''
}
复制代码
这个文件上传的时候放在.gitignore
里面就能够了。或者项目有CI
支持的话,能够先用CI
对文件进行一个加密也能够。函数
过程大概是这样,在使用upload进行组件的上传的时候,先使用beforeUpload
获取到本次上传所须要的token
值,而后把token
填在上传的data
里面,而后上传到七牛对应的QINIU_SERVER
那边去,这样最后那边上传以后返回的url
,上面这些过程都是利用Upload
自己所提供的API
来完成。具体实现过程能够参考下面的demo
。post
import React, { useState, Fragment } from "react";
import { Form, Upload, Modal, Icon } from "antd";
import { getToken } from "utils/qiniu";
// 七牛默认的上传地址(即为post接口)
const QINIU_SERVER = "http://upload.qiniup.com";
// bucket绑定的URL
const BASE_QINIU_URL = "";
const FormItem = Form.Item;
function Demo(props) {
const { getFieldDecorator } = props.form;
// 用来预览弹出预览图片的Modal框框
const [previewVisible, setPreviewVisible] = useState(false);
const [previewImage, setPreviewImage] = useState("");
// 存储七牛返回的token值
const [token, setToken] = useState("");
// 存取上传七牛返回的值
const [fileList, setFileList] = useState([]);
// antd form表单的一个排版设计
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 8 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 }
}
};
// 预览
const handlePreview = file => {
setPreviewImage(file.url || file.thumbUrl);
setPreviewVisible(true);
};
const handleChange = ({ file, fileList }) => {
const { uid, name, type, thumbUrl, status, response = {} } = file;
const fileItem = {
uid,
name,
type,
thumbUrl,
status,
url: BASE_QINIU_URL + (response.hash || "")
};
fileList.pop();
fileList.push(fileItem);
// 这里必需要用展开运算符,不然会有error,具体能够参考antd文档
setFileList([...fileList]);
};
const getUploadToken = () => {
const token = getToken();
setToken(token);
};
const uploadButton = (
<div>
<Icon type="plus" />
<div className="ant-upload-text">上传</div>
</div>
);
return (
<Fragment>
<Form>
<FormItem label="上传文件 " {...formItemLayout}>
{getFieldDecorator("scwj", {
rules: [
{
required: false
}
]
})(
<>
<Upload
action={QINIU_SERVER}
data={{ token }}
listType="picture-card"
beforeUpload={getUploadToken}
fileList={fileList}
onPreview={handlePreview}
onChange={handleChange}
>
{fileList.length >= 1 ? null : uploadButton}
</Upload>
</>
)}
</FormItem>
</Form>
<Modal visible={previewVisible} footer={null} onCancel={handleCancel}>
<img style={{ width: "100%" }} src={previewImage} alt="previewImg" />
</Modal>
</Fragment>
);
}
export default Demo;
复制代码