Node.js Nodejs POST未接收文件

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'

我想创建一个API来接收从web上传的文件。然后我将对该文件进行检查(查看.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>

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)