使用 ReactJS 上传文件组件
Upload File Component with ReactJS
我一直在到处寻找有关制作组件的帮助,以帮助管理从 React 中上传文件到我设置的端点。
我尝试了多种选择,包括集成 filedropjs。我决定反对它,因为我无法控制它在 DOM 和 new FileDrop('zone', options);
中设置的元素
这是我目前拥有的:
module.exports = React.createClass({
displayName: "Upload",
handleChange: function(e){
formData = this.refs.uploadForm.getDOMNode();
jQuery.ajax({
url: 'http://example.com',
type : 'POST',
xhr: function(){
var myXhr = $.ajaxSettings.xhr();
if(myXhr.upload){
myXhr.upload.addEventListener('progress',progressHandlingFunction, false);
}
return myXhr;
},
data: formData,
cache: false,
contentType: false,
processData: false,
success: function(data){
alert(data);
}
});
},
render: function(){
return (
<form ref="uploadForm" className="uploader" encType="multipart/form-data" onChange={this.handleChange}>
<input ref="file" type="file" name="file" className="upload-file"/>
</form>
);
}
});
},
render: function(){
console.log(this.props.content);
if(this.props.content != ""){
return (
<img src={this.props.content} />
);
} else {
return (
<form className="uploader" encType="multipart/form-data" onChange={this.handleChange}>
<input ref="file" type="file" name="file" className="upload-file"/>
</form>
);
}
}
});
如果有人能给我指出正确的方向,我会发送一些虚拟的拥抱。我一直在做这方面的广泛工作。我觉得我很接近,但还不够。
谢谢!
这可能有帮助
var FormUpload = React.createClass({
uploadFile: function (e) {
var fd = new FormData();
fd.append('file', this.refs.file.getDOMNode().files[0]);
$.ajax({
url: 'http://localhost:51218/api/Values/UploadFile',
data: fd,
processData: false,
contentType: false,
type: 'POST',
success: function(data){
alert(data);
}
});
e.preventDefault()
},
render: function() {
return (
<div>
<form ref="uploadForm" className="uploader" encType="multipart/form-data" >
<input ref="file" type="file" name="file" className="upload-file"/>
<input type="button" ref="button" value="Upload" onClick={this.uploadFile} />
</form>
</div>
);
}
});
从这里借来的How to send FormData objects with Ajax-requests in jQuery?
我也为此工作了很长时间。这是我想出的。
一个Dropzone
组件,结合使用superagent.
// based on https://github.com/paramaggarwal/react-dropzone, adds image preview
const React = require('react');
const _ = require('lodash');
var Dropzone = React.createClass({
getInitialState: function() {
return {
isDragActive: false
}
},
propTypes: {
onDrop: React.PropTypes.func.isRequired,
size: React.PropTypes.number,
style: React.PropTypes.object
},
onDragLeave: function(e) {
this.setState({
isDragActive: false
});
},
onDragOver: function(e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
this.setState({
isDragActive: true
});
},
onDrop: function(e) {
e.preventDefault();
this.setState({
isDragActive: false
});
var files;
if (e.dataTransfer) {
files = e.dataTransfer.files;
} else if (e.target) {
files = e.target.files;
}
_.each(files, this._createPreview);
},
onClick: function () {
this.refs.fileInput.getDOMNode().click();
},
_createPreview: function(file){
var self = this
, newFile
, reader = new FileReader();
reader.onloadend = function(e){
newFile = {file:file, imageUrl:e.target.result};
if (self.props.onDrop) {
self.props.onDrop(newFile);
}
};
reader.readAsDataURL(file);
},
render: function() {
var className = 'dropzone';
if (this.state.isDragActive) {
className += ' active';
};
var style = {
width: this.props.size || 100,
height: this.props.size || 100,
borderStyle: this.state.isDragActive ? 'solid' : 'dashed'
};
return (
<div className={className} onClick={this.onClick} onDragLeave={this.onDragLeave} onDragOver={this.onDragOver} onDrop={this.onDrop}>
<input style={{display: 'none' }} type='file' multiple ref='fileInput' onChange={this.onDrop} />
{this.props.children}
</div>
);
}
});
module.exports = Dropzone
使用 Dropzone
.
<Dropzone onDrop={this.onAddFile}>
<p>Drag & drop files here or click here to browse for files.</p>
</Dropzone>
将文件添加到拖放区后,将其添加到要上传的文件列表中。我将它添加到我的助焊剂商店。
onAddFile: function(res){
var newFile = {
id:uuid(),
name:res.file.name,
size: res.file.size,
altText:'',
caption: '',
file:res.file,
url:res.imageUrl
};
this.executeAction(newImageAction, newFile);
}
您可以使用 imageUrl 显示文件的预览。
<img ref="img" src={this.state.imageUrl} width="120" height="120"/>
要上传文件,获取文件列表并通过超级代理发送。我使用的是 flux,所以我从那家商店获取图像列表。
request = require('superagent-bluebird-promise')
Promise = require('bluebird')
upload: function(){
var images = this.getStore(ProductsStore).getNewImages();
var csrf = this.getStore(ApplicationStore).token;
var url = '/images/upload';
var requests = [];
var promise;
var self = this;
_.each(images, function(img){
if(!img.name || img.name.length == 0) return;
promise = request
.post(url)
.field('name', img.name)
.field('altText', img.altText)
.field('caption', img.caption)
.field('size', img.size)
.attach('image', img.file, img.file.name)
.set('Accept', 'application/json')
.set('x-csrf-token', csrf)
.on('progress', function(e) {
console.log('Percentage done: ', e.percent);
})
.promise()
.then(function(res){
var newImg = res.body.result;
newImg.id = img.id;
self.executeAction(savedNewImageAction, newImg);
})
.catch(function(err){
self.executeAction(savedNewImageErrorAction, err.res.body.errors);
});
requests.push(promise);
});
Promise
.all(requests)
.then(function(){
console.log('all done');
})
.catch(function(){
console.log('done with errors');
});
}
我面临的任务是获得类似 facebook 或 gmail 的行为,一旦用户开始将文件拖到 window 上的任何位置,您的放置目标就会突出显示。我找不到现成的 React 拖放解决方案。所以,我做了一个。
它应该是最基本的,为您提供一个基础来定制和设计您自己的风格。它提供了许多挂钩,使您能够做到这一点。但是也有一个演示可以给你一个例子。
有一个 Dropzone npm 包
我一直在到处寻找有关制作组件的帮助,以帮助管理从 React 中上传文件到我设置的端点。
我尝试了多种选择,包括集成 filedropjs。我决定反对它,因为我无法控制它在 DOM 和 new FileDrop('zone', options);
这是我目前拥有的:
module.exports = React.createClass({
displayName: "Upload",
handleChange: function(e){
formData = this.refs.uploadForm.getDOMNode();
jQuery.ajax({
url: 'http://example.com',
type : 'POST',
xhr: function(){
var myXhr = $.ajaxSettings.xhr();
if(myXhr.upload){
myXhr.upload.addEventListener('progress',progressHandlingFunction, false);
}
return myXhr;
},
data: formData,
cache: false,
contentType: false,
processData: false,
success: function(data){
alert(data);
}
});
},
render: function(){
return (
<form ref="uploadForm" className="uploader" encType="multipart/form-data" onChange={this.handleChange}>
<input ref="file" type="file" name="file" className="upload-file"/>
</form>
);
}
});
},
render: function(){
console.log(this.props.content);
if(this.props.content != ""){
return (
<img src={this.props.content} />
);
} else {
return (
<form className="uploader" encType="multipart/form-data" onChange={this.handleChange}>
<input ref="file" type="file" name="file" className="upload-file"/>
</form>
);
}
}
});
如果有人能给我指出正确的方向,我会发送一些虚拟的拥抱。我一直在做这方面的广泛工作。我觉得我很接近,但还不够。
谢谢!
这可能有帮助
var FormUpload = React.createClass({
uploadFile: function (e) {
var fd = new FormData();
fd.append('file', this.refs.file.getDOMNode().files[0]);
$.ajax({
url: 'http://localhost:51218/api/Values/UploadFile',
data: fd,
processData: false,
contentType: false,
type: 'POST',
success: function(data){
alert(data);
}
});
e.preventDefault()
},
render: function() {
return (
<div>
<form ref="uploadForm" className="uploader" encType="multipart/form-data" >
<input ref="file" type="file" name="file" className="upload-file"/>
<input type="button" ref="button" value="Upload" onClick={this.uploadFile} />
</form>
</div>
);
}
});
从这里借来的How to send FormData objects with Ajax-requests in jQuery?
我也为此工作了很长时间。这是我想出的。
一个Dropzone
组件,结合使用superagent.
// based on https://github.com/paramaggarwal/react-dropzone, adds image preview
const React = require('react');
const _ = require('lodash');
var Dropzone = React.createClass({
getInitialState: function() {
return {
isDragActive: false
}
},
propTypes: {
onDrop: React.PropTypes.func.isRequired,
size: React.PropTypes.number,
style: React.PropTypes.object
},
onDragLeave: function(e) {
this.setState({
isDragActive: false
});
},
onDragOver: function(e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'copy';
this.setState({
isDragActive: true
});
},
onDrop: function(e) {
e.preventDefault();
this.setState({
isDragActive: false
});
var files;
if (e.dataTransfer) {
files = e.dataTransfer.files;
} else if (e.target) {
files = e.target.files;
}
_.each(files, this._createPreview);
},
onClick: function () {
this.refs.fileInput.getDOMNode().click();
},
_createPreview: function(file){
var self = this
, newFile
, reader = new FileReader();
reader.onloadend = function(e){
newFile = {file:file, imageUrl:e.target.result};
if (self.props.onDrop) {
self.props.onDrop(newFile);
}
};
reader.readAsDataURL(file);
},
render: function() {
var className = 'dropzone';
if (this.state.isDragActive) {
className += ' active';
};
var style = {
width: this.props.size || 100,
height: this.props.size || 100,
borderStyle: this.state.isDragActive ? 'solid' : 'dashed'
};
return (
<div className={className} onClick={this.onClick} onDragLeave={this.onDragLeave} onDragOver={this.onDragOver} onDrop={this.onDrop}>
<input style={{display: 'none' }} type='file' multiple ref='fileInput' onChange={this.onDrop} />
{this.props.children}
</div>
);
}
});
module.exports = Dropzone
使用 Dropzone
.
<Dropzone onDrop={this.onAddFile}>
<p>Drag & drop files here or click here to browse for files.</p>
</Dropzone>
将文件添加到拖放区后,将其添加到要上传的文件列表中。我将它添加到我的助焊剂商店。
onAddFile: function(res){
var newFile = {
id:uuid(),
name:res.file.name,
size: res.file.size,
altText:'',
caption: '',
file:res.file,
url:res.imageUrl
};
this.executeAction(newImageAction, newFile);
}
您可以使用 imageUrl 显示文件的预览。
<img ref="img" src={this.state.imageUrl} width="120" height="120"/>
要上传文件,获取文件列表并通过超级代理发送。我使用的是 flux,所以我从那家商店获取图像列表。
request = require('superagent-bluebird-promise')
Promise = require('bluebird')
upload: function(){
var images = this.getStore(ProductsStore).getNewImages();
var csrf = this.getStore(ApplicationStore).token;
var url = '/images/upload';
var requests = [];
var promise;
var self = this;
_.each(images, function(img){
if(!img.name || img.name.length == 0) return;
promise = request
.post(url)
.field('name', img.name)
.field('altText', img.altText)
.field('caption', img.caption)
.field('size', img.size)
.attach('image', img.file, img.file.name)
.set('Accept', 'application/json')
.set('x-csrf-token', csrf)
.on('progress', function(e) {
console.log('Percentage done: ', e.percent);
})
.promise()
.then(function(res){
var newImg = res.body.result;
newImg.id = img.id;
self.executeAction(savedNewImageAction, newImg);
})
.catch(function(err){
self.executeAction(savedNewImageErrorAction, err.res.body.errors);
});
requests.push(promise);
});
Promise
.all(requests)
.then(function(){
console.log('all done');
})
.catch(function(){
console.log('done with errors');
});
}
我面临的任务是获得类似 facebook 或 gmail 的行为,一旦用户开始将文件拖到 window 上的任何位置,您的放置目标就会突出显示。我找不到现成的 React 拖放解决方案。所以,我做了一个。
它应该是最基本的,为您提供一个基础来定制和设计您自己的风格。它提供了许多挂钩,使您能够做到这一点。但是也有一个演示可以给你一个例子。