Node.js Nodejs POST未接收文件
我想创建一个API来接收从web上传的文件。然后我将对该文件进行检查(查看.png是否是真正的.png而不是.exe),然后将该文件发送到另一个API 但现在我被困在接收文件部分 我一直在google和stackoverflow中搜索,但这两种方法都不管用 我托管API的地方:Firebase函数 示例代码: html代码:Node.js Nodejs POST未接收文件,node.js,express,google-cloud-functions,multer,formidable,Node.js,Express,Google Cloud Functions,Multer,Formidable,我想创建一个API来接收从web上传的文件。然后我将对该文件进行检查(查看.png是否是真正的.png而不是.exe),然后将该文件发送到另一个API 但现在我被困在接收文件部分 我一直在google和stackoverflow中搜索,但这两种方法都不管用 我托管API的地方:Firebase函数 示例代码: html代码: <html> <body> <form ref='uploadForm' id='uploadForm'
<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>
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是否正常工作,请尝试一个全面的中间件,并将其放在中间件链的早期(在cors处理之后但在正文解析之前,我有我的中间件): onFileUploadStart(文件/*,请求,资源*/){ log('multer.onFileUploadStart!',文件); 这绝对可以捕获发送文件的任何内容 编辑:我使用的是旧版本和不推荐的东西,看起来…对不起
当你再看一遍你的代码时…你的CORS在哪里处理?你需要它来处理跨域、跨协议甚至跨端口的浏览器请求 在这里检查或尝试
或Multer:内存存储引擎将文件作为
缓冲区
对象存储在内存中。它没有任何选项。
使用内存存储时,文件信息将包含一个名为buffer
的字段,该字段包含整个文件。
因为您正在进行内存上传。看看您是真的想上传到内存还是磁盘?s步骤1是添加一些简单的错误处理来表示,步骤2(如果您无法从错误中解决问题(我猜测这是EACCES)显示错误。我绕过cors,API成功到达服务器并返回响应。如果我这样实现,只是get文件代码工作不正常?
var upload=multer({onFileUploadStart(file/*,req,res*/){console.log('multer.onFileUploadStart!',file);}}
和router.post('/fileChecker',upload.single('doc'),函数(req,res,next){console.log('Initilize fileChecker'))
。如果它是正确的,那么multer.onFileUploadStart的console.log就不会出现啊,我试过了,但它在我的设置中不起作用。因此,我尝试查找我正在使用的onFileUploadStart
,似乎我正在使用一个旧的multer版本,而现在onFileUploadStart
已经被弃用了,很抱歉误导您!没关系,至少你试着帮忙。无论如何,谢谢:)该文件应该保留一段时间,以便由其他代码处理,然后可以删除。根据multer文档,dest的意思是上传到内存,对吗?看起来firebase函数与dest选项不兼容。它将有部署问题。不,内存不需要任何选项。请参阅我附加的链接。Your文件在缓冲区中。明确指定:内存存储引擎将文件作为缓冲区对象存储在内存中。“它没有任何选项。”选项用于DiskStorage。此外,缓冲区在req.file.buffer
中实现,对吗?我的代码首先无法检测到req.file
。var uploadFile=multer({storage:multer.memoryStorage(),})。single('photo'))
var-photo=req.files.photo | | | req.file | | | null;
然后var-data=photo.buffer.toString('base64');
并选中file.buffer
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)