Node.js检查文件类型:Multer +文件类型+读取块

时间:2018-07-03 02:03:15

标签: node.js multer file-type

我正在构建一个可以接收文件并检查上载文件的实际文件类型的API。这是为了避免用户通过将文件扩展名从.exe更改为.png来上传假的.png文件。

这是我的nodejs代码:

const functions = require('firebase-functions');

//<----------Setup Express, cors and router to call API by public--------------->
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 cors = require('cors')({ origin: true }); // Automatically allow cross-origin requests

//>----------Done: Setup Express, CORS and router to call API by public--------<


//<----------Setup multer to catch uploaded file--------------->
const multer = require('multer');
const upload = multer();
//>----------Done: Setup multer to catch uploaded file--------<


//<----------Setup file-type to process file--------------->
const readChunk = require('read-chunk');
const fileType = require('file-type');
//>----------Done: Setup file-type to process file--------<


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.array(), 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 (files.length > 0) {
        files.map(element => {
            try {
                const buffer = readChunk.sync(element, 0, 4100);
                checkResults.push(fileType(buffer));
            }
            catch (err) {
                console.log(err)
                var returnMsg = returnFailed
                returnMsg.resultDesc = err
                returnMsg.resultAction = 'fileChecker'
                returnMsg.timeStamp = Date.now()
                res.status(500).send(returnMsg)
            }
        })
        var returnMsg = returnSuccess
        returnMsg.timeStamp = Date.now()
        returnMsg.resultDesc = 'success'
        res.status(200).send(returnMsg)
    }
    res.status(200).send('Processed Ntg')
});

//------------------------function seperator------------------------------>


router.get('/', function (req, res) {
    return res.status(200).send('Tata! Get into API d')
})

//------------------------function seperator------------------------------>

router.get('/subAPI', function (req, res) {
    return res.status(200).send('Tata! Get into sub-API d')
})

//------------------------function seperator------------------------------>

app.use(cors)
app.use(router)

exports.api = functions.https.onRequest(app)

我当前的问题

当我将文件发布到api / fileChecker时,req.file或req.files总是未定义或为空数组。

我如何进行POST:

我正在使用POSTMAN发送带有表单数据主体的POST命令,并附加了2个文件(空密钥和文件作为值)

同时,我需要一些帮助来检查我的代码对于file-type处理是否正确。我按照npm文档进行编码,但仍然无法验证。

谢谢。

0 个答案:

没有答案