react-s3-uploader
Version:
React component that renders a file input and automatically uploads to an S3 bucket
120 lines (103 loc) • 3.93 kB
JavaScript
;
var React = require('react'),
ReactDOM = require('react-dom'),
S3Upload = require('./s3upload.js'),
objectAssign = require('object-assign');
var ReactS3Uploader = React.createClass({
propTypes: {
signingUrl: React.PropTypes.string,
getSignedUrl: React.PropTypes.func,
preprocess: React.PropTypes.func,
onProgress: React.PropTypes.func,
onFinish: React.PropTypes.func,
onError: React.PropTypes.func,
signingUrlMethod: React.PropTypes.string,
signingUrlHeaders: React.PropTypes.object,
signingUrlQueryParams: React.PropTypes.oneOfType([
React.PropTypes.object,
React.PropTypes.func
]),
signingUrlWithCredentials: React.PropTypes.bool,
uploadRequestHeaders: React.PropTypes.object,
contentDisposition: React.PropTypes.string,
server: React.PropTypes.string,
scrubFilename: React.PropTypes.func
},
getDefaultProps: function() {
return {
preprocess: function(file, next) {
console.log('Pre-process: ' + file.name);
next(file);
},
onProgress: function(percent, message) {
console.log('Upload progress: ' + percent + '% ' + message);
},
onFinish: function(signResult) {
console.log("Upload finished: " + signResult.publicUrl)
},
onError: function(message) {
console.log("Upload error: " + message);
},
server: '',
signingUrlMethod: 'GET',
scrubFilename: function(filename) {
return filename.replace(/[^\w\d_\-\.]+/ig, '');
}
};
},
uploadFile: function() {
this.myUploader = new S3Upload({
fileElement: ReactDOM.findDOMNode(this),
signingUrl: this.props.signingUrl,
getSignedUrl: this.props.getSignedUrl,
preprocess: this.props.preprocess,
onProgress: this.props.onProgress,
onFinishS3Put: this.props.onFinish,
onError: this.props.onError,
signingUrlMethod: this.props.signingUrlMethod,
signingUrlHeaders: this.props.signingUrlHeaders,
signingUrlQueryParams: this.props.signingUrlQueryParams,
signingUrlWithCredentials: this.props.signingUrlWithCredentials,
uploadRequestHeaders: this.props.uploadRequestHeaders,
contentDisposition: this.props.contentDisposition,
server: this.props.server,
scrubFilename: this.props.scrubFilename
});
},
abort: function() {
this.myUploader && this.myUploader.abortUpload();
},
clear: function() {
clearInputFile(ReactDOM.findDOMNode(this));
},
render: function() {
return React.DOM.input(this.getInputProps());
},
getInputProps: function() {
var temporaryProps = objectAssign({}, this.props, {type: 'file', onChange: this.uploadFile});
var inputProps = {};
var invalidProps = Object.keys(ReactS3Uploader.propTypes);
for(var key in temporaryProps) {
if(temporaryProps.hasOwnProperty(key) && invalidProps.indexOf(key) === -1) {
inputProps[key] = temporaryProps[key];
}
}
return inputProps;
}
});
// http://stackoverflow.com/a/24608023/194065
function clearInputFile(f){
if(f.value){
try{
f.value = ''; //for IE11, latest Chrome/Firefox/Opera...
}catch(err){ }
if(f.value){ //for IE5 ~ IE10
var form = document.createElement('form'),
parentNode = f.parentNode, ref = f.nextSibling;
form.appendChild(f);
form.reset();
parentNode.insertBefore(f,ref);
}
}
}
module.exports = ReactS3Uploader;