Files
yudao-asset-cloud/admin-web/src/components/Image/PicturesWall.js
2019-05-06 23:30:30 +08:00

210 lines
5.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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',
// }
],
};
componentDidMount() {
if (this.props.urls) {
this.setUrls(this.props.urls);
}
}
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) {
debugger;
// 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;
};
getUrl = () => {
let urls = this.getUrls();
if (urls && urls.length > 0) {
return urls[0];
}
return undefined;
};
setUrls = (urls) => {
// let urls = this.props.urls;
if (urls) {
let fileList = [];
for (let i in urls) {
let url = urls[i];
fileList.push({
uid: -i,
name: url,
status: 'done',
url,
});
}
this.setState({
fileList: fileList,
})
}
};
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, // 最大照片墙图片数量
urls: Array, // 初始图片列表
};
export default PicturesWall;