You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
5.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React from "react";
import {fileGetQiniuToken} from "../../services/admin";
import uuid from "js-uuid";
import * as qiniu from "qiniu-js";
import {Icon, Modal, Upload} from "antd";
import styles from './PicturesWall.less';
/**
* 照片墙,带有上传图片到七牛。
*/
class PicturesWall extends React.Component {
state = {
token: undefined, // 七牛 token
previewVisible: false,
previewImage: '',
fileList: [
// { // 目前图片
// uid: -1,
// name: 'xxx.png',
// status: 'done',
// url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
// }
],
};
handleCancel = () => this.setState({ previewVisible: false })
handlePreview = (file) => {
this.setState({
previewImage: file.url || file.thumbUrl,
previewVisible: true,
});
}
beforeUpload = async () => {
const tokenResult = await fileGetQiniuToken();
if (tokenResult.code !== 0) {
alert('获得七牛上传 Token 失败');
return false;
}
this.setState({
token: tokenResult.data,
});
return true;
};
customRequest = ({action,
file,
headers,
onError,
onProgress,
onSuccess,
withCredentials,}) => {
// fs.readFile(path, function(err, data) {
// if (err) return;
// let md5Value= crypto.createHash('md5').update(data, 'utf8').digest('hex');
// let observable = qiniu.upload(file, md5Value, this.state.token);
// observable.subscribe(function () {
// // next
// }, function () {
// // error
// }, function (response) {
// // complete
// debugger;
// onSuccess(response, file);
// });
// });
// 使用 FileReader 将上传的文件转换成二进制流,满足 'application/octet-stream' 格式的要求
const reader = new FileReader();
reader.readAsArrayBuffer(file);
let fileData = null;
reader.onload = (e) => {
// 在文件读取结束后执行的操作
fileData = e.target.result;
// debugger;
// let md5Value= crypto.createHash('md5').update(fileData, 'utf8').digest('hex');
// 上传文件
// fileUploadQiniu(fileData);
// debugger;
// 使用 axios 进行文件上传的请求
// axios.put(action, fileData, {
// withCredentials,
// headers,
// onUploadProgress: ({ total, loaded }) => {
// // 进行上传进度输出,更加直观
// onProgress({ percent: Math.round(loaded / total * 100).toFixed(2) }, file);
// },
// }).then(response => {
// onSuccess(response, file);
// })
// .catch(onError);
let key = uuid.v4(); // TODO 芋艿可能后面要优化。MD5
let observable = qiniu.upload(file, key, this.state.token); // TODO 芋艿,最后后面去掉 qiniu 的库依赖,直接 http 请求,这样更轻量
observable.subscribe(function () {
// next
}, function () {
// error
// TODO 芋艿,后续补充
debugger;
}, function (response) {
// complete
// debugger;
response.url = 'http://static.shop.iocoder.cn/' + response.key; // 需要设置,用于后续 onSuccess ,合并到 file 中,从而设置到 fileList
onSuccess(response, file);
});
};
return {
abort() {
console.log('upload progress is aborted.');
},
};
};
handleChange = ({ file, fileList }) => {
if (file.response && file.response.url) {
// debugger
// file.url =
for (let i in fileList) {
if (fileList[i].uid === file.uid) {
fileList[i].url = file.response.url;
}
}
}
this.setState({ fileList });
}
getUrls = () => {
let urls = [];
for (let i in this.state.fileList) {
urls.push(this.state.fileList[i].url);
}
return urls;
};
render() {
const { previewVisible, previewImage, fileList } = this.state;
const uploadButton = (
<div>
<Icon type="plus" />
<div className="ant-upload-text">Upload</div>
</div>
);
return (
<div className="clearfix">
<Upload
// action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
// action="https://up-z2.qiniu.com"
listType="picture-card"
fileList={fileList}
onPreview={this.handlePreview}
onChange={this.handleChange}
beforeUpload={this.beforeUpload}
customRequest={this.customRequest}
>
{fileList.length >= this.props.maxLength ? null : uploadButton}
</Upload>
<Modal visible={previewVisible} footer={null} onCancel={this.handleCancel}>
<img alt="example" style={{ width: '100%' }} src={previewImage} />
</Modal>
</div>
);
}
};
PicturesWall.propTypes = {
maxLength: Number,
};
export default PicturesWall;