Formidable 返回 TypeError,ERR_INVALID_ARG_TYPE:“path”参数未定义

问题描述 投票:0回答:3

我在使用 formidable 上传文件时遇到问题。我使用的是 Windows Server 2016。

我的代码完整如下所示,基于 https://www.geeksforgeeks.org/how-to-upload-file-using-formidable-module-in-node-js/

const express = require('express');
const fs = require('fs');
const path = require('path')
const formidable = require('formidable');
   
const app = express();
   
app.post('/api/upload', (req, res, next) => {
    
    const form = new formidable.IncomingForm(
        { uploadDir: __dirname + '\\tmp',  keepExtensions: true }
    );
    form.parse(req, function(err, fields, files){
        var oldPath = files.profilePic.path;
        var newPath = path.join(__dirname, 'uploads')
                + '/'+files.profilePic.name
        var rawData = fs.readFileSync(oldPath)
      
        fs.writeFile(newPath, rawData, function(err){
            if(err) console.log(err)
            return res.send("Successfully uploaded")
        })
  })
});
   
app.listen(3000, function(err){
    if(err) console.log(err)
    console.log('Server listening on Port 3000');
});

我使用Postman发送文件。

触发

/api/upload
API时,发送的文件正确放置在tmp文件夹中,但读取路径时出现问题:

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string or an instance of Buffer or URL. Received undefined

这条消息指向

fs.readFileSync(oldPath)

console.log('files='+files)
返回
files=[object Object]

console.log('files.profilePic='+files.profilePic)
回归

C:\somepath\node_modules\formidable\src\PersistentFile.js:50
    return `PersistentFile: ${this._file.newFilename}, Original: ${this._file.originalFilename}, Path: ${this._file.filepath}`;
                                         ^

TypeError: Cannot read properties of undefined (reading 'newFilename')
    at PersistentFile.toString (C:\somepath\node_modules\formidable\src\PersistentFile.js:50:42)

所有 4 个引用的模块都存在于 node_modules 文件夹中。

node.js file-upload formidable
3个回答
5
投票

简单改变

var oldPath = files.profilePic.path;

var oldPath = files.profilePic.filepath;

还要确保创建“uploads”文件夹,因为代码不会创建它,如果没有它,它将失败。

编辑:旁注是,如果您的环境在控制台记录对象时只是吐出[对象对象],那么可能会得到一个提供有用信息的新环境(Visual Studio代码很好)。


0
投票

改变 var oldPath = 文件.profilePic.path

oldPath = 文件.profilePic.文件路径

将纠正错误


0
投票

我知道这是一个老问题,但由于我看到的一些教程仍然有与上面相同的代码或类似的代码,我猜 formidable 已经改变了他的 api,所以上面的代码不再起作用了。对于强大的 v3.5.1

files.profilePic
是一个数组,因此要访问文件路径,我们必须使用
files.profilePic[0].filepath

© www.soinside.com 2019 - 2024. All rights reserved.