在我目前工作的應用程序中,有幾個是通過superagent
提交給一個Express端點API文件形式。例如,圖像數據發佈,像這樣:如何上傳從ReactJS文件Express端點
updateImage: function(evt) {
this.setState({
image: evt.target.files[0]
}, function() {
console.log('image:', this.state.image);
});
},
AWSAPI.uploadImage
看起來是這樣的:
handleSubmit: function(evt) {
var imageData = new FormData();
if (this.state.image) {
imageData.append('image', this.state.image);
AwsAPI.uploadImage(imageData, 'user', user.id).then(function(uploadedImage) {
console.log('image uploaded:', uploadedImage);
}).catch(function(err) {
this.setState({ error: err });
}.bind(this));
}
}
和this.state.image
從文件輸入設置這樣
uploadImage: function(imageData, type, id) {
var deferred = when.defer();
request.put(APIUtils.API_ROOT + 'upload/' + type + '/' + id)
.type('form')
.send(imageData)
.end(function(res) {
if (!res.ok) {
deferred.reject(res.text);
} else {
deferred.resolve(APIUtils.normalizeResponse(res));
}
});
return deferred.promise;
}
而且最後,文件接收端點如下所示:
exports.upload = function(req, res) {
req.pipe(req.busboy);
req.busboy.on('file', function(fieldname, file) {
console.log('file:', fieldname, file);
res.status(200).send('Got a file!');
});
};
目前,接收端點的on('file')
功能不會被調用,因此沒有任何反應。以前,我嘗試過使用multer而不是Busboy的類似方法,但沒有成功(req.body
包含解碼圖像文件,req.files
爲空)。
我在這裏錯過了什麼嗎?從(ReactJS)Javascript應用程序上傳文件到Express API端點的最佳方法是什麼?
您是否試過[socket.io](http://socket.io/)?它可以用來傳輸二進制數據和jsons – 2014-11-20 17:51:29
@DmitryMatveev我認爲socket。不幸的是,io只是爲了將一些JSON /文件從客戶端發送到服務器而略微矯枉過正。我並不需要所有的實時功能 – Jakemmarsh 2014-11-20 18:00:47
您使用的是什麼前端。如果不是那麼具體,你可以試試[jQuery Form插件](https://github.com/malsup/form/)。它發出必要的事件,例如*提交之前*,* uploadProgress *,*成功*,*錯誤*。服務器端,你可以使用[Node Formidable](https://github.com/felixge/node-formidable)。 – 2014-12-05 07:36:02