node.js - Nodejs POST未接收文件
问题描述
我想创建一个 API 来接收来自网络的上传文件。然后我将处理对文件的检查(查看 .png 是否是真正的 .png 而不是 .exe),然后将文件发送到另一个 API。
但现在我被困在接收文件部分。
我一直在 google 和 stackoverflow 中搜索,但是这两种方法都不起作用。
我在哪里托管我的 API: Firebase 函数
示例代码:
html代码:
<html>
<body>
<form ref='uploadForm'
id='uploadForm'
action='https://<project>.cloudfunctions.net/api/upload'
method='post'
encType="multipart/form-data">
<input type="file" name="sampleFile" />
<input type='submit' value='Upload!' />
</form>
</body>
</html>
节点代码:
formidable
const functions = require('firebase-functions');
const express = require('express');
const app = express();
app.post('/upload', function (req, res) {
console.log('initializing upload')
var IncomingForm = require('formidable').IncomingForm
var form = new IncomingForm()
form.uploadDir = 'uploads'
form.parse(req, function (err, fields, files) {
if (err) {
console.log('some error', err)
res.status(400).send(err)
} else if (!files.file) {
console.log('no file received')
res.status(400).send('no file received')
} else {
var file = files.file
console.log('saved file to', file.path)
console.log('original name', file.name)
console.log('type', file.type)
console.log('size', file.size)
res.status(400).send(file.path, file.name, file.type, file.size)
}
})
});
exports.api = functions.https.onRequest(app)
connect-busboy
const functions = require('firebase-functions');
const express = require('express');
const app = express();
var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy());
//...
app.post('/upload', function(req, res) {
var fstream;
req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
res.status('200').send('uploaded')
// fstream = fs.createWriteStream(__dirname + '/files/' + filename);
// file.pipe(fstream);
// fstream.on('close', function () {
// res.redirect('back');
// });
});
});
exports.api = functions.https.onRequest(app)
express-fileupload
const functions = require('firebase-functions');
const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();
// default options
app.use(fileUpload());
app.post('/upload', function(req, res) {
console.log('upload initializing')
if (!req.files)
return res.status(400).send('No files were uploaded.');
// The name of the input field (i.e. "sampleFile") is used to retrieve the uploaded file
let sampleFile = req.files.sampleFile;
if(req.files){
console.log('File Uploaded')
res.status('200').send('File uploaded!');
}
});
exports.api = functions.https.onRequest(app)
multer
const functions = require('firebase-functions');
const express = require('express'); // call express
const app = express(); // define our app using express
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
const router = express.Router();
const multer = require('multer');
var storage = multer.memoryStorage()
var upload = multer({ storage: storage })
const readChunk = require('read-chunk');
const fileType = require('file-type');
var returnSuccess = {
resultCode: 1,
resultDesc: '',
resultData: '',
dataCount: 0,
resultAction: '',
timeStamp: Date.now()
}
var returnFailed = {
resultCode: -1,
resultDesc: '',
resultAction: '',
timeStamp: Date.now()
}
router.post('/fileChecker', upload.single('doc'), function (req, res, next) {
console.log('Initilize FileChecker')
var files = []
var checkResults = []
var file = req.file
files = req.files
console.log(file)
console.log(files)
if(file){
console.log('got the FILE!')
}
res.status(200).send('Processed Ntg')
});
app.use(router)
exports.api = functions.https.onRequest(app)
*补充说明:
1)对于 multer,firebase 托管似乎与 dest 选项不兼容。如果设置 dest 选项会出现部署错误。
2)所有代码在部署到firebase托管后都经过测试,我没有在我的本地测试。
我不知道出了什么问题..请帮忙..
解决方案
Multer:内存存储引擎将文件作为Buffer
对象存储在内存中。它没有任何选择。使用内存存储时,文件信息将包含一个名为的字段,该字段buffer
包含整个文件。
查看文档
因为你正在做内存上传。看看你真的要上传到内存还是磁盘?
推荐阅读
- javascript - 从 JSON 对象按顺序将值存储在数组中
- python - 如何从 python 3.8 中的同级包目录导入?
- javascript - 从nodejs在anaconda环境中调用带有args的python文件
- jquery - Bootstrap 多选显示为列表框
- reactjs - 显示嵌入 CKEditor 5 的媒体
- google-cloud-platform - 我可以在 Google Cloud Compute Engine 上安装 MySQL 吗?
- python - 从具有类作为装饰器的函数装饰器返回
- c++ - 虚幻多人在运行时交换材质
- mysql - 对于每个月的订单,查找按时交付的订单数量
- repl.it - 在本地使用 repl.it 数据库