import { IconButton, Avatar, Typography } from "@material-ui/core";
import _ServerURL from './../components/Ajax/_ServerURL';
import { ask } from "../components/_requst";
async function _upload_files(tag, base64Str, callback) {
const url = `${_ServerURL.main}`+'upload/index';
const body = {
method: 'POST',
body: {
tag,
value: base64Str,
}
};
const res = await ask(url, body);
let result = null;//
if (res && 1 == res.code)
result = res.value;//
if (callback)
callback(result);
}
function _press_image(file, thenFun, errFun, append = {}) {
const { maxWidth = 600,
maxHeight = 800,
quality = 0.75,
maxSize = 0.8,
resize = true } = append;//
let size = file.size / 1024 / 1024;
new Promise((resolve, _) => {
if (size > maxSize) { //压缩..
const compress = new Compress();
compress.compress([file], {
size: maxSize, // the max size in MB, defaults to 2MB
quality: quality, // the quality of the image, max is 1,
maxWidth: maxWidth, // the max width of the output image, defaults to 1920px
maxHeight: maxHeight, // the max height of the output image, defaults to 1920px
resize: resize, // defaults to true, set false if you do not want to resize the image width and height
}).then((res) => {
resolve(res[0].prefix + res[0].data);
});
} else {//读取base64格式文件.
const reader = new FileReader();
reader.addEventListener('load', () => resolve(reader.result));
reader.readAsDataURL(file);
}
}).then(res => thenFun(file, res)).catch(err => errFun(err));
}
/**
* 显示图片,点击将会上传新的图片信息.
* @param error 是否是错误
* @param placeholder 说明文字
* @param remark 追加说明
* @param required 是否必填
* @param value 当前的值.
* @param onChange 更新处理方法 (url,keyword)
* @param {number} tag 所属单位ID,此处如果不填写,则默认为9999.
*/
class JAvatar extends React.Component {
constructor(props) {
super(props);
this.state = {
loading: false, /***是否在图片加载中...*/
src:null, /*** */
}
}
static getDerivedStateFromProps(nextProps) {
if (nextProps && null != nextProps && undefined != nextProps.onChange) {
return {
src:nextProps.value || null,
}
}
return null;
}
fileChanges = (event) => {
let source = event.target.files;
this.setState({ loading: true });
if (source.length > 0) {
_press_image(source[0], (file, res) => {
const tmp = {
...file,
data: res /***此处为base64格式的图片*/
}
// const { files } = this.state;//
// files.push(tmp);
// this.valueChange(files);
// this.setState({ files, loading: false });
this.wrapFiles(tmp);
}, err => {
this.setState({ loading: false });
});
} else {
}
}
linkChange= ()=>{
this.handler.click();
}
wrapFiles = (input) => {
const {tag = 9999,onChange, size = 1, name} = this.props;
_upload_files(tag, input.data, rest => {
let url = rest.value;
if (onChange) {
onChange(url,name);
this.setState({ loading: false });
} else {
this.setState({ src:url, loading: false });
}
});
}
render() {
const { placeholder ,remark,error } = this.props;
const {src} = this.state;
return (<div style={{textAlign:'center'}}>
<input ref={ref => this.handler = ref} onChange={this.fileChanges}
accept="image/*" type="file" style={{ display: 'none' }} />
<IconButton color={error ? 'secondary' : 'primary'} onClick={()=>{
this.linkChange();
}}>
<Avatar src={src}
style={{ height: 120, 120 }}>
</Avatar>
</IconButton>
<Typography variant='body1'>
<small>{placeholder}</small>
</Typography>
<Typography variant='body2'>
<small style={{fontSize:8}}>{remark}</small>
</Typography>
</div>);
}
}
export default JAvatar;