首先咱們的需求大概是這樣的,咱們須要使用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;
複製代碼