[英]File uploading using Busboy, html/ajax, and nodejs
我遵循了另一個使用busboy上傳並在堆棧溢出處獲取文件的示例:
Node.js文件上傳(Express 4,MongoDB,GridFS,GridFS-Stream)
但是,與其讓busboy對'busboy.on(...)'id做出反應,不如通過在ajax調用中處理數據來解決它,從而使頁面僅在form action等上不變。我的前端在反應js,這就是它,以及我之前如何嘗試這樣做:
import React, {Component} from 'react';
import {bindAll} from 'lodash';
import $ from 'jquery';
export default class Pitch extends React.Component {
constructor(props) {
super(props);
this.state = {
data_uri: null,
processing: false
}
bindAll(this, 'handleFile', 'handleSubmit');
}
handleSubmit(e) {
e.preventDefault();
const _this = this;
this.setState({
processing: true
});
const promise = $.ajax({
url: '/file/video',
type: "POST",
data: {
data_uri: this.state.data_uri,
filename: this.state.filename,
filetype: this.state.filetype
},
dataType: 'json'
});
promise.done(function(data){
_this.setState({
processing: false,
uploaded_uri: data.uri
});
});
}
handleFile(e) {
const reader = new FileReader();
const file = e.target.files[0];
reader.onload = (upload) => {
this.setState({
data_uri: upload.target.result,
filename: file.name,
filetype: file.type
});
console.log(this.state.data_uri);
};
reader.readAsDataURL(file);
}
render() {
let processing;
let uploaded;
if (this.state.uploaded_uri) {
uploaded = (
<div>
<h4>Image uploaded!</h4>
<img className='image-preview' src={this.state.uploaded_uri} />
<pre className='image-link-box'>{this.state.uploaded_uri}</pre>
</div>
);
}
if (this.state.processing) {
processing = "Processing image, hang tight";
}
return (
<div className='row'>
<div className='col-sm-12'>
<label>Upload an image</label>
<form onSubmit={this.handleSubmit} encType="multipart/form-data">
<input type="file" name="file" onChange={this.handleFile} />
<input disabled={this.state.processing} className='btn btn-primary' type="submit" value="Upload" />
{processing}
</form>
{uploaded}
</div>
</div>
);
}
}
我想我的問題是我不需要為觸發ajax調用而在數據字段中發送什么確切的信息來觸發服務器中的busboy.on..
服務器調用:
app.post('/file/video', function(req, res) {
var busboy = new Busboy({ headers : req.headers });
var fileId = new mongoose.mongo.ObjectId();
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
console.log('got file', filename, mimetype, encoding);
var writeStream = gfs.createWriteStream({
_id: fileId,
filename: filename,
mode: 'w',
content_type: mimetype,
});
file.pipe(writeStream);
}).on('finish', function() {
// show a link to the uploaded file
res.writeHead(200, {'content-type': 'text/html'});
res.end('<a href="/file/' + fileId.toString() + '">download file</a>');
});
req.pipe(busboy);
});
啊,我搜索了一下之后就知道了,但是我們可以像這樣發送formdata:
let data = new FormData(document.getElementById('formData'));
const promise = $.ajax({
url: '/file/video',
type: "POST",
data: data /*{
data_uri: this.state.data_uri,
filename: this.state.filename,
filetype: this.state.filetype
}*/,
processData: false,
contentType: false
//dataType: 'json'
});
通過搜索表單數據..:p
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.