J’ai cherché partout de l’aide pour créer un composant permettant de gérer le téléchargement de fichiers depuis React vers un terminal que j’ai configuré.
J’ai essayé de nombreuses options, y compris l’intégration de http://filedropjs.org . J’ai décidé de ne pas le contrôler car je ne contrôle pas les éléments qu’il installe dans le DOM avec le new FileDrop('zone', options);
C’est ce que j’ai jusqu’à présent:
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 ( ); } }); }, render: function(){ console.log(this.props.content); if(this.props.content != ""){ return (
); } else { return ( ); } } });
Si quelqu’un pouvait juste me diriger dans la bonne direction, j’enverrais des câlins virtuels. J’ai beaucoup travaillé là-dessus. J’ai l’impression d’être proche, mais pas tout à fait là.
Merci!
J’ai travaillé là-dessus aussi longtemps. C’est ce que j’ai imaginé.
Un composant Dropzone
, associé à l’utilisation de 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 ( {this.props.children} ); } }); module.exports = Dropzone
Utiliser le Dropzone
.
Drag & drop files here or click here to browse for files.
Lorsqu’un fichier est ajouté à la zone de repository, ajoutez-le à votre liste de fichiers à télécharger. Je l’ajoute à mon magasin de stream.
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); }
Vous pouvez utiliser l’imageUrl pour afficher un aperçu du fichier.

Pour télécharger les fichiers, obtenez la liste des fichiers et envoyez-les via superagent. J’utilise le stream, alors je reçois la liste des images de ce magasin.
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'); }); }
Cela peut aider
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 ( ); } });
emprunté ici Comment envoyer des objects FormData avec des requêtes Ajax dans jQuery?
J’ai été confronté à la tâche d’obtenir un comportement semblable à celui de Facebook ou de Gmail où votre cible disparaît dès que l’utilisateur commence à faire glisser un fichier n’importe où sur la fenêtre. Il n’y avait pas de solution prête à l’emploi que je pourrais trouver. Alors, j’en ai créé un.
Il est destiné à être nu, vous fournissant une base pour personnaliser et personnaliser le vôtre. Il fournit de nombreux hooks pour vous permettre de le faire. Mais il y a aussi une démo qui vous donne un exemple à suivre.
Découvrez-le: https://www.npmjs.com/package/react-file-drop
Il existe un package npm Dropzone pour cette https://www.npmjs.com/package/react-dropzone