UNPKG

@beisen/form-uploader

Version:

form file image uploader

1,421 lines (1,277 loc) 50.2 kB
'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _toolTip = require('@beisen/tool-tip'); var _toolTip2 = _interopRequireDefault(_toolTip); var _commonLabel = require('@beisen/common-label'); var _commonLabel2 = _interopRequireDefault(_commonLabel); var _commonFunc = require('@beisen/common-func'); require('../src/index.scss'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } /* eslint-disable */ function getBody(xhr) { var text = xhr.responseText || xhr.response; if (!text) { return text; } try { return JSON.parse(text); } catch (e) { return text; } } var fileiconName = { aac: 'asc', ape: 'ape', asf: 'asf', avi: 'avi', doc: 'doc', docx: 'docx', exe: 'exe', file: 'file', flac: 'flac', flv: 'flv', folder: 'folder', folder2: 'folder2', gif: 'gif', image: 'image', jpeg: 'jpeg', jpg: 'jpg', m4a: 'm4a', m4v: 'm4v', mkv: 'mkv', mmap: 'mmap', mov: 'mov', mp3: 'mp3', mp4: 'mp4', mpeg: 'mpeg', mpg: 'mpg', music: 'music', none: 'none', ogg: 'ogg', pdf: 'pdf', pic: 'pic', png: 'png', ppt: 'ppt', pptx: 'pptx', rar: 'rar', rm: 'rm', rmvb: 'rmvb', tif: 'tif', ts: 'ts', txt: 'txt', video: 'video', wav: 'wav', wma: 'wma', wmv: 'wmv', xls: 'xls', xlsx: 'xlsx', zip: 'zip' }; var defaultTranslation = { fileSizeZeroError: '文件大小不许为0字节!', previewDownloadText: '下载', reUploadText: '重新上传', uploadOnceLimit: '单次上传文件数不能超过{0}个', fileNameContainsCommaError: '文件名不允许包含符号","', allFilesCountLimit: '总文件数不能超过{0}个', emptyText: '- 空 -', fileTypeError: '文件格式错误!!!', fileSizeBigError: '上传文件大小不得超过{0}!', uploadText: '上传' }; var FormUploader = function (_Component) { _inherits(FormUploader, _Component); function FormUploader(props) { _classCallCheck(this, FormUploader); // const defaults = { // labelText: '', // 左侧文字` // labelTip: '', // 右侧提示信息 // status: 'show', // show状态 和 edit 状态 // url: '', // 上传地址 // multiple: true, // fileInputName: '', // fileSize: '2mb',// mb kb b // fileType: [], // 提供文件验证类型 // onceUploadCount: 3, // multiple时 // allUploadConut: 6, // hasLoadFile: [], // 已经上传的文件 // extendData: {}, // key-value // isDrag: true, // formItem 拖拽默认有 粘贴没有 // isPaste: true, // 只有功能性组件 默认有 // hasLoadFile: [], // 已经上传文件 // previewText: '' || '预览', // maxLength:false, // onSuccess: () => {}, // 发送数据成功回调 // onFailure: () => {}, // 请求失败回调 // onProgress: () => {}, // 请求过程回调 // onDragOver: () => {}, // 文件拖至区域 // onDragLeave: () => {}, // 文件离开区域 // onDrop: () => {} // 拖至区域 // }; var _this = _possibleConstructorReturn(this, _Component.call(this, props)); _this.valiFileTypeIfPass = function (name, suportArr) { var ifsuport = false; var lastIndex = name.lastIndexOf('.'); var fileType = name.slice(lastIndex + 1, name.length); suportArr.map(function (cmp, index) { if (cmp.toLowerCase() == fileType.toLowerCase()) { ifsuport = true; } }); return ifsuport; }; _this.checkIsPreviewType = function (url, supportData) { if (!supportData) return false; // 这里拿链接地址进行判断 是不是包含在支持预览的地址里面的 var index = url.lastIndexOf('.'); var type = url.slice(index + 1, url.length); if (supportData.indexOf(type) >= 0) { return 'true'; } else { return 'false'; } }; _this.renderHelpText = function () { var _this$props = _this.props, hiddenTip = _this$props.hiddenTip, sideTip = _this$props.sideTip, briefDescription = _this$props.briefDescription; if (!briefDescription) return; return _react2.default.createElement( _toolTip2.default, { title: briefDescription, hidden: hiddenTip, side: sideTip }, _react2.default.createElement( 'div', { className: 'form-uploader-help' }, briefDescription ) ); }; _this.translation = _extends({}, defaultTranslation, props.translation); _this.previewUrl = {}; for (var i = 0; i < props.hasLoadFile.length; i++) { if (props.hasLoadFile[i].Name == "") { props.hasLoadFile.splice(i, 1); } } _this.tempRank = null; _this.state = { hasUploadCount: props.hasLoadFile && props.hasLoadFile.length || 0, isDrag: props.isDrag || true, // isPaste: props.isPaste || true, // fileList: [], // 通过input添加的文件 response: props.hasLoadFile || [], // 上传成功返回的结果 isSuccess: false, currentFileList: [], // 单次通过input添加的文件 currentFile: [], //总的input添加的文件 errorMessage: props.errorMessage, //必填验证 errorShow: { type: false, messages: '' }, disappearTime: 2, //自动消失时间,默认为1.5s,可选值有1.5,3,5,10 isRenderInput: true, //重新渲染上传按钮,刷新上传按钮的值 uid: _this.getUid(), isRequest: false, //wangyongning 请求过程中 isDel: 0 //删除的个数 }; _this.changeFiles = _this.changeFiles.bind(_this); _this.deleteFile = _this.deleteFile.bind(_this); _this.renderShow = _this.renderShow.bind(_this); _this.renderCurrentFile = _this.renderCurrentFile.bind(_this); _this.disButton = _this.disButton.bind(_this); _this.clickPreview = _this.clickPreview.bind(_this); _this.getPreviewUrl = _this.getPreviewUrl.bind(_this); _this.handleKeyDown = _this.handleKeyDown.bind(_this); return _this; } // zhongjiahao FormUploader.prototype.getUid = function getUid() { var now = +new Date(); var index = 0; return 'upload-' + now + '-' + ++index; }; FormUploader.prototype.reset = function reset() { var _id = 'uploader-input-' + this.tempRank; var btn = document.getElementById(_id); btn.setAttribute('value', ''); }; // input type file change 事件 FormUploader.prototype.changeFiles = function changeFiles(event) { var _props = this.props, multiple = _props.multiple, onceUploadCount = _props.onceUploadCount, allUploadConut = _props.allUploadConut, onceUploadFiles = _props.onceUploadFiles; var response = this.state.response; var _hasUploadCount = response.length || 0; var files = event.target.files || event.dataTransfer.files; var self = this; /* 多选时 单次上传数量验证 */ try { if (multiple && onceUploadCount < files.length) { // self.refs.formUploader.value = ""; if (onceUploadFiles) { onceUploadFiles(0); } throw { name: "TypeError", message: (0, _commonFunc.transFormat)(this.translation.uploadOnceLimit, onceUploadCount) + '!' }; } for (var i = files.length - 1; i >= 0; i--) { var temp = files[i]; var name = temp.name; if (name.indexOf(",") != -1) { throw { name: "TypeError", message: this.translation.fileNameContainsCommaError }; break; } }; if (multiple && _hasUploadCount + files.length > allUploadConut) { // self.refs.formUploader.value = ""; if (onceUploadFiles) { onceUploadFiles(0); } throw { name: "TypeError", message: (0, _commonFunc.transFormat)(this.translation.allFilesCountLimit, allUploadConut) + '!' }; } } catch (err) { // for (let i = 0; i < files.length; i++) { // currentFile.pop(); // } this.state.errorShow.messages = err.message; this.state.errorShow.type = true; this.setState(this.state); setTimeout(function () { self.state.errorShow.type = false; self.state.maxLength = false; self.setState(self.state); }, self.state.disappearTime * 1000); return; } if (_hasUploadCount + files.length == allUploadConut) { // this.setState({maxLength: true}) this.state.maxLength = true; } this.fileThen(files); this.reset(); }; FormUploader.prototype.fileThen = function fileThen(files) { var currentFileList = this.state.currentFileList; var onceUploadFiles = this.props.onceUploadFiles; var self = this; for (var i = 0; i < files.length; i++) { if (files[i].size == 0) { this.state.errorShow.messages = this.translation.fileSizeZeroError; this.state.errorShow.type = true; this.setState({ maxLength: false }); setTimeout(function () { self.state.errorShow.type = false; self.setState(self.state); }, self.state.disappearTime * 1000); if (onceUploadFiles) { onceUploadFiles(0); } // return; //注释掉该return, 在这return会造成后续正常文件无法上传的情况,且删除报错等问题 } if (files[i].size != 0) { currentFileList.push(files[i]); } } this.state.isSuccess = false; // this.setState(this.state); this.fileValidCheck(); if (currentFileList.length == 0) return; // this.refs.formUploader.value = ''; this.fileReader(); // xuqian // 文件多个上传 this.count = 0; this.allCount = currentFileList.length; this.uploadDone = false; for (var _i = 0; _i < currentFileList.length; _i++) { this.uploadFile(this.formData(currentFileList[_i])); } //this.uploadFile(this.formData()); }; // 图片 预览 HTML5 FormUploader.prototype.fileReader = function fileReader() { var _this2 = this; var self = this; var currentFileList = this.state.currentFileList; var _loop = function _loop(i) { if (currentFileList[i].type.indexOf('image') != 0) return 'continue'; var readers = new FileReader(); readers.addEventListener('load', function (event) { if (self.state.currentFileList[i]) self.state.currentFileList[i].dataUrl = event.target.result; self.setState(_this2.state); }, false); readers.readAsDataURL(currentFileList[i]); }; for (var i = 0; i < currentFileList.length; i++) { var _ret = _loop(i); if (_ret === 'continue') continue; } }; FormUploader.prototype.translateImage = function translateImage(fileUrl, size) { // var tempFileSum = fileUrl.split(".") // var fileType = tempFileSum[tempFileSum.length-1] // var translateSrc = fileUrl // if (tempFileSum.length > 2) { // var index = fileUrl.indexOf(fileType) - 1 // translateSrc = fileUrl.substring(0, index) + '_' + size + '.' + fileType // } else { // translateSrc = tempFileSum[0] + '_' + size + '.' + fileType // } //修改为在地址后面加resize20作为压缩参数,之前为在末尾 xxx_20.png 这种格式 var tempFileSum = fileUrl.split("/"); var url = tempFileSum[2]; var index = fileUrl.indexOf(url); var translateSrc = '//' + url + '/resize' + size + fileUrl.substring(index + url.length, fileUrl.length); return BSGlobal.supportPicCompression ? translateSrc : fileUrl; }; // 文件格式正则 FormUploader.prototype.fileRegExp = function fileRegExp() { var fileType = this.props.fileType; var temp = void 0; // 文件格式验证 if (!fileType) { // const fileType = ['jpeg','JPEG','pdf','PDF','docx','DOCX','xlsx','XLSX','ppt','PPT','rar','RAR','txt','TXT','xls','XLS','doc','zip','ZIP','jpg','JPG','gif','GIF','png','PNG','pptx','PPTX','mmap','MMAP']; // temp = fileType.join('|'); temp = 'alltype'; } else { temp = fileType.join('|'); } return new RegExp('(' + temp + ')$', 'i'); }; FormUploader.prototype.fileMaxSize = function fileMaxSize() { var fileSize = this.props.fileSize; // 文件限制大小 var sizeLabel = { 'b': 1, 'B': 1, 'kb': 1024, 'Kb': 1024, 'KB': 1024, 'M': 1024 * 1024, 'mb': 1024 * 1024, 'Mb': 1024 * 1024, 'MB': 1024 * 1024 }; return fileSize && sizeLabel[fileSize.match(/\D+/i)[0]] * fileSize.match(/\d+/i)[0] || 2 * 1024 * 1024; }; // 文件 格式、大小验证 FormUploader.prototype.fileValidCheck = function fileValidCheck() { var reg_image = this.fileRegExp(); // 返回文件正则 var maxSize = this.fileMaxSize(); // 返回文件大小 var currentFileList = this.state.currentFileList; var _props2 = this.props, onceUploadFiles = _props2.onceUploadFiles, _props2$cutsomFileTyp = _props2.cutsomFileTypeErrorTip, cutsomFileTypeErrorTip = _props2$cutsomFileTyp === undefined ? this.translation.fileTypeError : _props2$cutsomFileTyp, fileSizeMessage = _props2.fileSizeMessage, fileTypeMessage = _props2.fileTypeMessage; var self = this; for (var i = 0; i < currentFileList.length; i++) { try { // 这里进行大小写模糊匹对 var fileTypeVali = this.valiFileTypeIfPass(currentFileList[i].name, this.props.fileType); if (reg_image.test('alltype') ? true : fileTypeVali) { // 格式 if (currentFileList[i].size > maxSize) { // 大小 if (onceUploadFiles) onceUploadFiles(0); // throw { name: 'TypeError', message: fileSizeMessage ? fileSizeMessage : (0, _commonFunc.transFormat)(this.translation.fileSizeBigError, this.props.fileSize) }; } } else { if (onceUploadFiles) onceUploadFiles(0); throw { name: 'TypeError', message: fileTypeMessage ? fileTypeMessage : cutsomFileTypeErrorTip }; } } catch (err) { //xuqian //提示信息的显示隐藏 this.state.errorShow.messages = err.message; this.state.errorShow.type = true; this.state.maxLength = false; this.state.currentFileList.splice(i, 1); i--; this.setState(this.state); setTimeout(function () { self.state.errorShow.type = false; self.state.maxLength = false; self.setState(self.state); }, self.state.disappearTime * 1000); } } }; // ajax or form 上传 FormUploader.prototype.uploadFile = function uploadFile(formData) { if (window.XMLHttpRequest && window.FormData) { this.uploadAjax(formData); } else { this.uploadForm(); } }; // ajax formData FormUploader.prototype.formData = function formData(currentFile) { var fileInputName = this.props.fileInputName; //const {currentFileList} = this.state; var formData = new FormData(); // xuqian // 文件多个上传 // for (let i = 0; i < currentFileList.length; i++) { // formData.append(fileInputName, currentFileList[i]); // } formData.append(fileInputName, currentFile); // 额外数据 var extendData = this.props.extendData; if (extendData) { for (var i in extendData) { formData.append(i, extendData[i]); } } return formData; }; // ajax上传文件 FormUploader.prototype.uploadAjax = function uploadAjax(formData) { var _props3 = this.props, onSuccess = _props3.onSuccess, multiple = _props3.multiple, onFailure = _props3.onFailure, onProgress = _props3.onProgress, url = _props3.url, withCredentials = _props3.withCredentials, onceUploadFiles = _props3.onceUploadFiles; //修改了currentFileList 用currentFile代替 var currentFileList = this.state.currentFileList; if (onceUploadFiles) { onceUploadFiles(currentFileList.length); } var self = this; var xhr = new XMLHttpRequest(); xhr.upload.addEventListener('progress', function (event) { if (!self.props.children && event.lengthComputable) { var value = event.loaded / event.total * 100; var progress = self.refs.progressCon.querySelectorAll('progress'); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = progress[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var dom = _step.value; //回调里没有唯一标示,简易判断时哪个进度条 if (dom.id && dom.id == event.total.toString()) { dom.value = value; } else { if (!dom.id) { dom.id = event.total; break; } } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } onProgress && onProgress(event); } }); xhr.onreadystatechange = function (event) { self.state.isRequest = true; //请求中 // 当 state 为 0 即开始上传时,先暂时将错误信息隐藏 if (xhr.readyState == 0) { self.state.errorShow.type = false; self.setState(self.state); } if (!multiple) { self.setState({ response: [], currentFileList: [] }); } if (xhr.readyState == 4) { if (xhr.status == 200) { self.state.isRequest = false; //请求完毕 self.state.response.push(getBody(xhr)); //多文件一起传当第一个文件传完进度条都得会消失,判断Bug,现改成如下 var responseData = JSON.parse(xhr.response); var index = self.state.currentFileList.findIndex(function (item) { return item.name == responseData.Name; }); self.state.currentFileList.splice(index, 1); if (self.state.currentFileList.length == 0) { self.state.isSuccess = true; } self.setState(self.state); self.count++; //当所有文件上传完后,将标志位置为true if (self.count == self.allCount) { self.uploadDone = true; } onSuccess && onSuccess(event, getBody(xhr), self.state.response, self.uploadDone); } else { self.state.isRequest = false; //请求完毕 self.state.currentFileList = []; self.state.isSuccess = true; self.state.maxLength = false; self.setState(self.state); onFailure && onFailure(event, getBody(xhr), self.state.response); } } }; xhr.open('post', url, true); if (withCredentials && 'withCredentials' in xhr) { xhr.withCredentials = true; }; xhr.send(formData); // function finishxhr() { // xhr.abort(); // }; }; // 原生 form提交 FormUploader.prototype.uploadForm = function uploadForm(files) { var fileInputName = this.props.fileInputName; var iframe = document.createElement('iframe'); iframe.name = "uploadTarget"; iframe.style.display = 'none'; document.body.appendChild(iframe); var form = document.createElement('form'), input = document.createElement('input'); form.action = fileInputName || "uploadfile"; form.method = "post"; form.target = iframe.name; form.enctype = "multipart/form-data"; input.type = 'file'; input.name = 'files'; input.value = files; form.appendChild(input); form.submit(); }; // 拖拽文件 FormUploader.prototype.dragFile = function dragFile(refValue) { var _props4 = this.props, onDragOver = _props4.onDragOver, onDragLeave = _props4.onDragLeave, onDrop = _props4.onDrop; var self = this; var node = this.refs[refValue]; if (node) { node.addEventListener('dragover', function (event) { event.stopPropagation(); event.preventDefault(); onDragOver && onDragOver(event); }, false); node.addEventListener('dragleave', function (event) { event.stopPropagation(); event.preventDefault(); onDragLeave && onDragLeave(event); }, false); node.addEventListener('drop', function (event) { event.stopPropagation(); event.preventDefault(); onDrop && onDrop(event); var files = event.dataTransfer.files; self.fileThen(files); }, false); } }; // 粘贴文件 FormUploader.prototype.pasteFile = function pasteFile(refValue) { var self = this; var node = this.refs[refValue]; node.addEventListener('paste', function (event) { // safari 木有 if (!(event.clipboardData && event.clipboardData.items)) return; var items = (event.clipboardData || event.originalEvent.clipboardData).items; if (!items.length) return; var blobs = []; // let reg_image = this.fileRegExp(); // 返回文件正则 // let maxSize = this.fileMaxSize(); // 返回文件限制大小 for (var i = 0; i < items.length; i++) { if (items[i].kind === 'file') { var blobItem = items[i].getAsFile(); if (blobItem.size === 0) return; if (!self.fileValidCheck(blobItem)) return; blobs.push(blobItem); } } self.fileThen(blobs); }, false); }; // 删除文件 FormUploader.prototype.deleteFile = function deleteFile(event) { if (this.state.isRequest) return; //如果在上传过程中 不能删除 var node = event.target; var index = node.getAttribute('data-index'); var tempFile = this.state.response.splice(parseInt(index), 1); if (this.state.currentFileList.length) { tempFile = this.state.currentFileList.splice(parseInt(index), 1); tempFile = []; } if (this.props.onDelete) { this.props.onDelete(tempFile); // wangyongning add: this.props.onDelete()方法成功后会返回true // 先删除数据 数据删除成功后再删除DOM 更新state this.state.maxLength = false; //this.setState(this.state); } }; // 渲染 编辑下 上传按钮 FormUploader.prototype.renderEditBtn = function renderEditBtn() { var _props5 = this.props, disabled = _props5.disabled, multiple = _props5.multiple, labelTip = _props5.labelTip, _props5$acceptData = _props5.acceptData, acceptData = _props5$acceptData === undefined ? '' : _props5$acceptData, hasLoadFile = _props5.hasLoadFile, allUploadConut = _props5.allUploadConut, _props5$uploadText = _props5.uploadText, uploadText = _props5$uploadText === undefined ? this.translation.uploadText : _props5$uploadText; var _state = this.state, maxLength = _state.maxLength, isRequest = _state.isRequest; var bool = multiple && (maxLength || hasLoadFile.length == allUploadConut) || isRequest ? "uploader_is-max" : ""; var tempRank = parseInt(Math.random() * 1000); this.tempRank = tempRank; return _react2.default.createElement( 'div', { className: "uploader-edit clearfix " + bool, ref: 'uploadEdit' }, _react2.default.createElement( 'a', { className: 'focusable-upload-btn', tabIndex: disabled ? -1 : 0, onClick: this.disButton, ref: 'focusableUploadBtn' }, _react2.default.createElement('input', { type: 'file', id: "uploader-input-" + this.tempRank, 'data-key': this.state.uid, className: 'lala', ref: 'formUploader', disabled: disabled || bool == "uploader_is-max", onChange: this.changeFiles, multiple: multiple || false, style: bool ? { display: 'none' } : { display: 'block' }, tabIndex: '-1', accept: acceptData, title: '' }), !multiple && (maxLength || hasLoadFile.length == allUploadConut) ? this.translation.reUploadText : (0, _commonFunc.decode)(uploadText) ), _react2.default.createElement( 'p', null, labelTip ) ); }; //让上传按钮在窗口出现期间不可点 FormUploader.prototype.disButton = function disButton(event) { var self = this; setTimeout(function () { self.refs.formUploader.disabled = true; }, 1); setTimeout(function () { self.refs.formUploader.disabled = false; }, 1000); event.target.blur(); }; /* 渲染 编辑态下 文件列表 */ FormUploader.prototype.renderCurrentFile = function renderCurrentFile() { var _this3 = this; var _state2 = this.state, currentFileList = _state2.currentFileList, isSuccess = _state2.isSuccess, isRequest = _state2.isRequest; var tempIcon = void 0; var processIcon = void 0; if (currentFileList.length == 0) return; return currentFileList && currentFileList.map(function (item, index) { var name = item.name.split('.'); if (item.dataUrl) { tempIcon = _react2.default.createElement('span', { className: 'file-icon file-picture' }); // tempIcon = <img src={item.dataUrl} /> } else { var file_icon = fileiconName[name[name.length - 1]] != undefined ? name[name.length - 1] : 'none'; tempIcon = _react2.default.createElement('span', { className: "file-icon " + 'file-' + file_icon }); } if (!isSuccess) { processIcon = _react2.default.createElement('progress', { value: '', max: '100' }); } else { var _fileType = name.pop(); processIcon = _react2.default.createElement( 'div', { className: 'filenameBox' }, ' ', _react2.default.createElement( 'p', { className: 'file-info' }, name.join('') ), _react2.default.createElement( 'p', { className: 'file-typename' }, "." + _fileType ) ); } return _react2.default.createElement( 'li', { key: index, 'data-index': index }, _react2.default.createElement( 'div', { className: 'file-left' }, tempIcon ), _react2.default.createElement( 'div', { className: 'file-center' }, processIcon ), _react2.default.createElement('div', { className: 'file-right' }), _react2.default.createElement( 'div', { className: 'upload-mask' }, _react2.default.createElement( 'div', { className: 'actions-view-file' }, isRequest ? '' : _react2.default.createElement('div', { className: 'delete-view-file', 'data-index': index, onClick: _this3.deleteFile }) ) ) ); }); }; FormUploader.prototype.getPreviewUrlNode = function getPreviewUrlNode(n) { if (n.nodeName == "LI") { return n; } else { return this.getPreviewUrlNode(n.parentNode); } }; FormUploader.prototype.trimUrl = function trimUrl(x) { return x && x.replace(/^\s+|\s+$/gm, ''); }; /*** li hover上去之后请求另外地址 拿到预览的地址 **/ FormUploader.prototype.getPreviewUrl = function getPreviewUrl(path, isdoc, clientUrl) { var url = this.props.previewUrl; var returnUrl = ""; if (!isdoc) { returnUrl = clientUrl; } else { if (url && path) { // const index = path.indexOf('//') + 2; // const keyspace = path.substring(index, path.indexOf('/', index)); // let paths = path.split("\/"); // let name = paths[paths.length - 1]; // returnUrl = url + window.BSGlobal.tenantInfo.Id + '/preview/' + keyspace + '/' + name; returnUrl = url + window.BSGlobal.tenantInfo.Id + '/preview?path=' + path; } } return returnUrl; }; /*** 点击预览 */ FormUploader.prototype.clickPreview = function clickPreview(e) { var node = this.getPreviewUrlNode(e.target); var url = node.getAttribute('data-preview'); var downloadUrl = node.getAttribute('data-downloadurl'); var canPreview = node.getAttribute('data-canPreView'); var type = ['jpeg', 'jpg', 'gif', 'png', 'bmp']; if (this.props.onPreviewImg && this.checkImageType(url, type)) { this.props.onPreviewImg(url); } else if (this.props.uploadType == 'BC_PictureUploader' || canPreview == 'true') { // 这里进行判断 其他的文件格式支不支持新页面打开 如果新页面打开不了 则走下载的链接进行下载 window.open(url, "_blank"); } else { window.location.href = downloadUrl; } // let url = this.previewUrl[index]; }; // 判断方法是在预览格式支持之内的方法 FormUploader.prototype.checkImageType = function checkImageType(url, type) { var isImage = false; var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = type[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var i = _step2.value; if (url.indexOf(i) >= 0) { isImage = true; break; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return isImage; }; /* 渲染 show状态下 */ FormUploader.prototype.renderShow = function renderShow() { var _this4 = this; var _props6 = this.props, _props6$hasLoadFile = _props6.hasLoadFile, hasLoadFile = _props6$hasLoadFile === undefined ? [] : _props6$hasLoadFile, status = _props6.status, _props6$readOnly = _props6.readOnly, readOnly = _props6$readOnly === undefined ? false : _props6$readOnly, hiddenTip = _props6.hiddenTip, sideTip = _props6.sideTip; var previewText = ''; var _hasLoadFile = hasLoadFile; var response = this.state.response; var tempList = void 0; if (status == 'edit') { tempList = response || []; } else { tempList = _hasLoadFile && _hasLoadFile.length != 0 ? _hasLoadFile : response || []; } if (tempList.length == 1) { var _temp = tempList[0]; if (!_temp.ClientUrl && !_temp.DownLoadUrl && !_temp.Name && !_temp.Path) { return; } } var imagesType = ['jpeg', 'JPEG', 'jpg', 'JPG', 'gif', 'GIF', 'png', 'PNG', 'bmp', 'BMP']; var docType = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'txt']; var temp = imagesType.join('|'); var doctemp = docType.join('|'); var reg = new RegExp('(' + temp + ')$', 'i'); var docreg = new RegExp('(' + doctemp + ')$', 'i'); var tempIcon = void 0; var deleteIcon = status == 'edit' && !readOnly ? _react2.default.createElement('span', { className: 'sys-icon-close' }) : undefined; if (tempList.length == 0) return; var self = this; if (this.props.status == 'show' && this.props.hasLoadFile.length == 0) tempList = []; return tempList && tempList.map(function (item, index) { var fileName = item.Name; var name = item.Name.split('.'); var isImg = false; var isdoc = false; if (reg.test(name[name.length - 1])) { previewText = ''; isImg = true; if (fileName.indexOf('txt') != -1) { var file_icon = fileiconName[name[name.length - 1]] != undefined ? name[name.length - 1] : 'none'; tempIcon = _react2.default.createElement('span', { className: "file-icon " + 'file-' + file_icon }); } else { tempIcon = _react2.default.createElement('span', { className: 'file-icon file-picture' }); // tempIcon = <img src={self.translateImage(item.ClientUrl,30)} />; //未做压缩处理,暂时已图标代替图片 } } else if (docreg.test(name[name.length - 1])) { previewText = ''; isImg = true; isdoc = true; var _file_icon = fileiconName[name[name.length - 1]] != undefined ? name[name.length - 1] : 'none'; tempIcon = _react2.default.createElement('span', { className: "file-icon " + 'file-' + _file_icon }); } else { previewText = _this4.translation.previewDownloadText; var _file_icon2 = fileiconName[name[name.length - 1]] != undefined ? name[name.length - 1] : 'none'; tempIcon = _react2.default.createElement('span', { className: "file-icon " + 'file-' + _file_icon2 }); } // let previewUrl = previewText == '下载' ? item.DownLoadUrl : item.ClientUrl; var previewUrl = item.ClientUrl; var imgDownloadUrl = item.DownLoadUrl; var ifPreview = _this4.checkIsPreviewType(fileName, _this4.props.supportPreviewData); var path = item.Path; name.pop(); var preurl = self.getPreviewUrl(path, isdoc, previewUrl); if (status == 'edit') { var _serachview = ""; if (isImg) { _serachview = _react2.default.createElement('div', { className: 'search-view-file', 'data-preurl': previewUrl, 'data-index': index, onClick: self.clickPreview, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }); } var deletview = ""; if (deleteIcon) { deletview = _react2.default.createElement('div', { className: 'sys-icon-cus-shanchu', 'data-index': index, onClick: self.deleteFile }); } return _react2.default.createElement( 'li', { key: index, 'data-index': index, 'data-isdoc': isdoc, 'data-clienturl': previewUrl, 'data-preview': preurl, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }, _react2.default.createElement( 'div', null, _react2.default.createElement( 'div', { className: 'file-left' }, tempIcon ), _react2.default.createElement( 'div', { className: 'file-center pic-type' }, _react2.default.createElement( 'div', { className: 'filenameBox' }, _react2.default.createElement( _toolTip2.default, { title: item.Name, hidden: hiddenTip, side: sideTip }, _react2.default.createElement( 'p', { className: 'file-info', 'data-preurl': previewUrl, 'data-index': index, onClick: self.clickPreview, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }, fileName ) ), _react2.default.createElement('span', { className: 'file-line' }), _react2.default.createElement('a', { tabIndex: '-1', href: imgDownloadUrl, className: 'file-preview sys-icon-fujian-xiazai', target: '_self' }), deletview ) ) ) ); } if (!isImg) { var _React$createElement; var _deletview = ""; if (deleteIcon) { _deletview = _react2.default.createElement('div', { className: 'delete-view-file', 'data-index': index, onClick: self.deleteFile }); } return _react2.default.createElement( 'li', (_React$createElement = { className: 'show-status', key: index, 'data-isdoc': isdoc }, _defineProperty(_React$createElement, 'data-isdoc', isdoc), _defineProperty(_React$createElement, 'data-clienturl', previewUrl), _defineProperty(_React$createElement, 'data-index', index), _defineProperty(_React$createElement, 'data-preview', preurl), _defineProperty(_React$createElement, 'data-downloadurl', imgDownloadUrl), _defineProperty(_React$createElement, 'data-canPreView', ifPreview), _React$createElement), _react2.default.createElement( 'div', { className: 'file-left' }, tempIcon ), _react2.default.createElement( 'div', { className: 'file-center' }, _react2.default.createElement( 'span', null, _react2.default.createElement( 'div', { className: 'filenameBox' }, _react2.default.createElement( _toolTip2.default, { title: item.Name, hidden: hiddenTip, side: sideTip }, _react2.default.createElement( 'p', { className: 'file-info', 'data-preurl': previewUrl, 'data-index': index, onClick: self.clickPreview, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }, fileName ) ), _react2.default.createElement('a', { tabIndex: '-1', href: imgDownloadUrl, className: 'file-preview sys-icon-fujian-xiazai', target: '_self' }) ) ) ) ); }if (!isImg) { var _deletview2 = ""; if (deleteIcon) { _deletview2 = _react2.default.createElement('div', { className: 'delete-view-file', 'data-index': index, onClick: self.deleteFile }); } return _react2.default.createElement( 'li', { className: 'show-status', key: index, 'data-isdoc': isdoc, 'data-clienturl': previewUrl, 'data-index': index, 'data-preview': preurl, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }, _react2.default.createElement( 'div', { className: 'file-left' }, tempIcon ), _react2.default.createElement( 'div', { className: 'file-center' }, _react2.default.createElement( _toolTip2.default, { title: item.Name, hidden: hiddenTip, side: sideTip }, _react2.default.createElement( 'span', null, _react2.default.createElement( 'div', { className: 'filenameBox' }, _react2.default.createElement( 'p', { className: 'file-info' }, fileName ) ) ) ) ), _react2.default.createElement( 'div', { className: 'upload-mask' }, _react2.default.createElement( 'div', { className: 'actions-view-file' }, _react2.default.createElement('a', { tabIndex: '-1', href: imgDownloadUrl, className: 'file-preview download-view-file', target: '_self' }), _deletview2 ) ) ); } if (deleteIcon == undefined) { var _serachview2 = ""; if (isImg) { _serachview2 = _react2.default.createElement('div', { className: 'search-view-file', 'data-index': index, 'data-preurl': previewUrl, onClick: self.clickPreview, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }); } return _react2.default.createElement( 'li', { className: 'show-status', key: index, 'data-isdoc': isdoc, 'data-clienturl': previewUrl, 'data-index': index, 'data-preview': preurl, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }, _react2.default.createElement( 'div', { className: 'file-left' }, tempIcon ), _react2.default.createElement( 'div', { className: 'file-center' }, _react2.default.createElement( 'span', null, _react2.default.createElement( 'div', { className: 'filenameBox' }, _react2.default.createElement( _toolTip2.default, { title: item.Name, hidden: hiddenTip, side: sideTip }, _react2.default.createElement( 'p', { className: 'file-info', 'data-preurl': previewUrl, 'data-index': index, onClick: self.clickPreview, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }, fileName ) ), _react2.default.createElement('a', { tabIndex: '-1', href: imgDownloadUrl, className: 'file-preview sys-icon-fujian-xiazai', target: '_self' }) ), _react2.default.createElement( 'p', { className: 'file-downIcon' }, previewText ) ) ) ); } var serachview = ""; if (isImg) { serachview = _react2.default.createElement('div', { className: 'search-view-file', 'data-index': index, onClick: self.clickPreview, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }); } return _react2.default.createElement( 'li', { className: 'show-status', key: index, 'data-isdoc': isdoc, 'data-clienturl': previewUrl, 'data-index': index, 'data-preview': preurl, 'data-downloadurl': imgDownloadUrl, 'data-canPreView': ifPreview }, _react2.default.createElement( 'div', { className: 'file-left' }, tempIcon ), _react2.default.createElement( 'div', { className: 'file-center' }, _react2.default.createElement( _toolTip2.default, { title: item.Name, hidden: hiddenTip, side: sideTip }, _react2.default.createElement( 'span', null, _react2.default.createElement( 'p', { className: 'file-info' }, fileName ), previewText ) ) ), _react2.default.createElement( 'div', { className: 'upload-mask' }, _react2.default.createElement( 'div', { className: 'actions-view-file' }, serachview, _react2.default.createElement('a', { tabIndex: '-1', href: imgDownloadUrl, className: 'file-preview download-view-file', target: '_self' }) ) ) ); }); }; FormUploader.prototype.componentWillMount = function componentWillMount() { if (this.props.hasLoadFile && this.props.hasLoadFile.length != 0) { this.state.response = _extends([], this.props.hasLoadFile); this.setState(this.state); } }; FormUploader.prototype.componentDidMount = function componentDidMount() { if (this.state.isDrag && this.props.status == 'edit') { this.dragFile('uploadEdit'); } if (this.props.status == 'edit') { var _id = 'uploader-input-' + this.tempRank; var btn = document.getElementById(_id); if (btn) { btn.addEventListener('click', function () { this.value = ''; }, false); } } document.addEventListener('keydown', this.handleKeyDown); }; FormUploader.prototype.componentWillUnmount = function componentWillUnmount() { document.removeEventListener('keydown', this.handleKeyDown); }; FormUploader.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) { if (nextProps.status != this.props.status && nextProps.hasLoadFile && nextProps.hasLoadFile.length != 0 || nextProps.hasLoadFile && nextProps.hasLoadFile.length != 0 && nextProps.hasLoadFile.length > this.state.response.length || JSON.stringify(nextProps.hasLoadFile) != JSON.stringify(this.props.hasLoadFile)) { this.state.response = _extends([], nextProps.hasLoadFile); } if (nextProps.isDrag != this.props.isDrag) this.state.isDrag = nextProps.isDrag; console.log(this.state.response); this.setState(this.state); }; /*xuqian 弹窗组件的显示隐藏状态设置 */ FormUploader.prototype.renderErrorMessage = function renderErrorMessage() { return _react2.default.createElement( 'p', { className: 'error-message' }, this.state.errorShow.messages ); }; FormUploader.prototype.renderMessage = function renderMessage() { if (this.state.currentFileList.length != 0 || this.props.hasLoadFile.length != 0) return; if (this.props.uploadType == 'BC_PictureUploader') { return _react2.default.createElement( 'p', { className: 'error-message' }, this.props.errorMessage.message ); } else { return _react2.default.createElement( 'p', { className: 'error-message' }, this.props.errorMessage.message ); } }; FormUploader.prototype.render = function render() { var _props7 = this.props, hidden = _props7.hidden, status = _props7.status, _props7$readOnly = _props7.readOnly, readOnly = _props7$readOnly === undefined ? false : _props7$readOnly, lablePos = _props7.lablePos, hasLoadFile = _props7.hasLoadFile; var rightStyle = {}; if (lablePos && status !== 'show') { rightStyle = { 'float': 'left', 'width': 'calc(100% - 118px)' }; } if (!hidden) { var fileAdd = status == 'edit' && !readOnly ? this.renderEditBtn() : undefined; var filesUlClass = status == 'edit' ? 'form-uploader-edit' : 'form-uploader-show'; return _react2.default.createElement( 'div', { className: "form-item formUploader " + (status == 'show' ? ' form-item_is-static' : '') + (!lablePos ? ' form-uploader__title-up-and-down ' : '') }, _react2.default.createElement(_commonLabel2.default, this.props), _react2.default.createElement( 'div', { id: 'field-right', className: 'field-right', style: rightStyle }, status == 'show' && (hasLoadFile.length == 0 || hasLoadFile[0].Name == '') ? _react2.default.createElement( 'div', { className: 'empty-style' }, this.translation.emptyText ) : '', fileAdd, this.renderHelpText(), _react2.default.createElement( 'div', { className: 'uploader-files' }, _react2.default.createElement( 'ul', { className: filesUlClass + ' clearfix', ref: 'progressCon' }, this.renderShow(), this.renderCurrentFile() ) ), status == 'edit' && !this.state.errorShow.type && this.props.errorMessage.error ? this.renderMessage() : '', status == 'edit' && this.state.errorShow.type ? this.renderErrorMessage() : '' ) ); } else { return _react2.default.createElement('div', null); } }; FormUploader.prototype.handleKeyDown = function handleKeyDown(e) { var focusableUploadBtn = this.refs.focusableUploadBtn, formUploader = this.refs.formUploader; switch (e.keyCode) { case 13: // 回车 if (e.target == focusableUploadBtn) { formUploader.click(); } break; case 9: // tab break; case 38: // 上 break; case 40: // 下 break; case 37: // 左 break; case 39: // 右 break; case 27: // esc break; default: // console.info(e); break; } }; return FormUploader; }(_react.Component); FormUploader.defaultProps = { hiddenTip: false, sideTip: false }; module.exports = FormUploader;