import React, { Component } from 'react'; import $ from 'jquery'; import Cropper from 'react-cropper'; import 'cropperjs/dist/cropper.css'; import {Button,message} from 'antd'; class CropBox extends Component { constructor(props) { super(props); this.state = { src: '', imgName:'', close: this.props.close ? this.props.close : true, url: this.props.url ? this.props.url : '', uploadData: this.props.uploadData ? this.props.uploadData : {}, aspectRatio: this.props.aspectRatio ? this.props.aspectRatio : '' } this.onChange = this.onChange.bind(this); this.cropImage = this.cropImage.bind(this); this.convertBase64UrlToBlob = this.convertBase64UrlToBlob.bind(this); this.submitUpload = this.submitUpload.bind(this); this.closeBox = this.closeBox.bind(this); } componentWillReceiveProps(nextProps) { this.setState({ close: nextProps.close }) } onChange(e) { e.preventDefault(); let files; if (e.dataTransfer) { files = e.dataTransfer.files; } else if (e.target) { files = e.target.files; } let reader = new FileReader(); reader.onload = () => { this.setState({ src: reader.result }); }; this.setState({ imgName:files[0].name }) reader.readAsDataURL(files[0]); } cropImage() { if (typeof this.cropper.getCroppedCanvas() == 'undefined'||this.cropper.getCroppedCanvas()==undefined) { message.warning('请选择图片!') return; } let img64Data = this.cropper.getCroppedCanvas().toDataURL(); let imgblobDates = this.convertBase64UrlToBlob(img64Data); //二进制文件格式 let imgfileDate = this.dataURLtoFile(img64Data,this.state.imgName); //文件流格式 this.submitUpload(imgfileDate,img64Data); } submitUpload(imgBlob,img64Data) { if(imgBlob.size>(2097152/2)){ message.warning('图片不能超过1M.'); return false; } this.props.closeFun(true); let _this = this,dataList={}; //转换为文件流传输 /* let fd = new FormData(); for(let key in this.state.uploadData) { fd.append(key, this.state.uploadData[key]); } fd.append('file',imgBlob); */ //datas数据传输 dataList.filename=this.state.imgName; dataList.sign=this.state.uploadData['sign']; dataList.picturebase=img64Data.split(',')[1]; $.ajax({ url: this.state.url, type: 'POST', dataType: 'json', // processData: false, // 注意:让jQuery不要处理数据 //文件流传输时释放 // contentType: false, // 注意:让jQuery不要设置contentType //文件流传输时释放 data:dataList, success: function (data) { if(data.error&&data.error.length>0){ message.error(data.error[0].message); }else{ if(_this.props.getUrl) { _this.props.getUrl(data.data); } message.success('上传成功'); } _this.setState({ close: true, src: '' }) }, error: function(err) { message.error(err) } }); } //将base64转换为文件 dataURLtoFile(dataurl, filename) { var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, {type:mime}); } //base64转二进制文件格式 convertBase64UrlToBlob(urlData) { var bytes=window.atob(urlData.split(',')[1]); //去掉url的头,并转换为byte //处理异常,将ascii码小于0的转换为大于0 var ab = new ArrayBuffer(bytes.length); var ia = new Uint8Array(ab); for (var i = 0; i < bytes.length; i++) { ia[i] = bytes.charCodeAt(i); } return new Blob( [ab] , {type : 'image/png'}); } selFile(){ document.querySelector('.crop-input input[type=file]').click(); } closeBox() { this.setState({ close: true }) this.props.closeFun(true) } render() { return (