lm-upload
Version:
* 作者:quying * 邮箱:qy9404@163.com * 版本:**`0.2.0`**
333 lines (276 loc) • 14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _jsxFileName = 'src/index.js';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
require('./index.scss');
var _uid = require('./uid');
var _uid2 = _interopRequireDefault(_uid);
var _request = require('./request');
var _request2 = _interopRequireDefault(_request);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: 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) : subClass.__proto__ = superClass; } /**
* Created by quying<qy9404@163.com>.
* ComponentName Upload
* Desc 组件描述内容
* GroupName lm-component
*/
/**
* @class Upload
* @extends React.Component
* @desc Upload Component for mobile
*/
var Upload = function (_Component) {
_inherits(Upload, _Component);
/**
* @constructor
*/
function Upload(props) {
_classCallCheck(this, Upload);
var _this = _possibleConstructorReturn(this, (Upload.__proto__ || Object.getPrototypeOf(Upload)).call(this, props));
_this.reqs = {};
_this.onClick = function () {
var appUpload = _this.props.appUpload;
if (appUpload) {
return appUpload();
}
var el = _this.fileInput;
if (!el) {
return;
}
el.click();
};
_this.state = {
uid: (0, _uid2.default)()
};
_this.changeHandler = _this.changeHandler.bind(_this);
return _this;
}
_createClass(Upload, [{
key: 'componentDidMount',
value: function componentDidMount() {
this._isMounted = true;
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this._isMounted = false;
this.abort();
}
}, {
key: 'changeHandler',
value: function changeHandler(e) {
var _this2 = this;
var files = e.target.files;
var onInputChange = this.props.onInputChange;
if (onInputChange) {
var changedRet = onInputChange(files);
if (changedRet && changedRet.then) {
changedRet.then(function (processedFiles) {
_this2.uploadFiles(processedFiles);
}).catch(function (e) {
console && console.log(e);
});
} else if (changedRet !== false) {
this.uploadFiles(changedRet);
}
} else {
this.uploadFiles(files);
this.reset();
}
e.target.value = '';
}
}, {
key: 'uploadFiles',
value: function uploadFiles(files) {
var _this3 = this;
var fileList = Array.prototype.slice.call(files);
fileList.forEach(function (file) {
file.uid = (0, _uid2.default)();
_this3.upload(file, fileList);
});
}
}, {
key: 'upload',
value: function upload(file, fileList) {
var _this4 = this;
var props = this.props;
if (!props.beforeUpload) {
this.post(file);
}
//返回 false 则停止上传。支持返回一个 Promise 对象,Promise 对象 reject 时则停止上传,resolve 时开始上传
var before = props.beforeUpload(file, fileList);
if (before && before.then) {
before.then(function (processedFile) {
var processedFileType = Object.prototype.toString.call(processedFile);
if (processedFileType === '[object String]' || processedFileType === '[object Blob]') {
_this4.post(file, processedFile);
} else {
_this4.post(file);
}
}).catch(function (e) {
console && console.log(e);
});
} else if (before !== false) {
this.post(file);
}
}
}, {
key: 'post',
value: function post(file, processedFile) {
var _this5 = this;
if (!this._isMounted) {
return;
}
var data = this.props.data;
if (typeof data === 'function') {
var dataRet = data(file);
if (dataRet.then) {
dataRet.then(function (ret) {
data = ret;
_this5.send(data, file, processedFile);
});
} else {
data = dataRet;
this.send(data, file, processedFile);
}
}
}
}, {
key: 'send',
value: function send(data, file, processedFile) {
var _this6 = this;
var props = this.props;
var uid = file.uid;
var onStart = props.onStart,
onProgress = props.onProgress;
var request = props.customUpload || _request2.default;
this.reqs[uid] = request({
action: props.action,
filename: props.name,
file: processedFile || file,
data: data,
headers: props.headers,
withCredentials: props.withCredentials,
onProgress: onProgress ? function (e) {
onProgress(e, file);
} : null,
onSuccess: function onSuccess(ret, xhr) {
delete _this6.reqs[uid];
props.onSuccess(ret, file, xhr);
},
onError: function onError(err, ret) {
delete _this6.reqs[uid];
props.onError(err, ret, file);
}
});
onStart(file);
}
}, {
key: 'reset',
value: function reset() {
this.setState({
uid: (0, _uid2.default)()
});
}
}, {
key: 'abort',
value: function abort(file) {
var reqs = this.reqs;
if (file) {
var uid = file;
if (file.uid) {
uid = file.uid;
}
if (reqs[uid]) {
reqs[uid].abort();
delete reqs[uid];
}
} else {
Object.keys(reqs).forEach(function (uid) {
if (reqs[uid]) {
reqs[uid].abort();
}
delete reqs[uid];
});
}
}
}, {
key: 'render',
value: function render() {
var _this7 = this;
var _props = this.props,
className = _props.className,
accept = _props.accept,
multiple = _props.multiple,
disabled = _props.disabled,
children = _props.children,
style = _props.style;
return _react2.default.createElement(
'span',
_defineProperty({ className: className, onClick: this.onClick, style: style, __source: {
fileName: _jsxFileName,
lineNumber: 235
},
__self: this
}, '__self', this),
_react2.default.createElement('input', _defineProperty({
type: 'file',
ref: function ref(node) {
return _this7.fileInput = node;
},
style: { display: 'none' },
accept: accept,
multiple: multiple,
disabled: disabled,
onChange: this.changeHandler, __source: {
fileName: _jsxFileName,
lineNumber: 236
},
__self: this
}, '__self', this)),
children
);
}
}]);
return Upload;
}(_react.Component);
Upload.propTypes = {
name: _propTypes2.default.string, //文件名
accept: _propTypes2.default.string, //接受的文件类型
multiple: _propTypes2.default.bool, //是否支持多选文件
onInputChange: _propTypes2.default.func, //(files) = > boolean | Promise
beforeUpload: _propTypes2.default.func, //(file, fileList) => boolean | Promise
customUpload: _propTypes2.default.func, //通过覆盖默认的上传行为,可以自定义自己的上传实现
disabled: _propTypes2.default.bool, //是否禁用
action: _propTypes2.default.string, //上传的地址
data: _propTypes2.default.oneOfType([//表单数据
_propTypes2.default.object, _propTypes2.default.func]),
headers: _propTypes2.default.object, //xhr请求头
onStart: _propTypes2.default.func, //开始上传回调
onProgress: _propTypes2.default.func, //上传进度 onProgress(e, file)
onSuccess: _propTypes2.default.func, //上传成功回调 onSuccess(ret, file, xhr)
withCredentials: _propTypes2.default.bool, //允许跨域发送cookie
appUpload: _propTypes2.default.func //调用app上传
};
Upload.defaultProps = {
multiple: false,
disabled: false,
isApp: false,
onStart: function onStart() {},
beforeUpload: function beforeUpload() {},
onError: function onError() {}
};
exports.default = Upload;
Upload.initFileList = _uid.initFileList;
module.exports = exports['default'];