javascript - app.js 主文件中未定义 toString - NodeJS

标签 javascript node.js formidable

我正在尝试获取上传文件的文件名,但在进行字符串操作时遇到错误,如下所示在nodejs的主应用程序文件中:

var fileName = file.split('path:')[1]
    .split('\',')[0]
    .split(dir)[1]
    .toString()
    .replace(/\\/g, '')
    .replace(/\//g, '');

我在 .toString() 处遇到错误,不知道为什么。

错误堆栈跟踪

TypeError: Cannot read property 'toString' of undefined
    at C:\Users\murli\NodeProjects\SpeechExpress\app.js:57:76
    at IncomingForm.<anonymous> (C:\Users\murli\NodeProjects\SpeechExpress\node_modules\formidable\lib\incoming_form.js:105:9)
    at emitNone (events.js:86:13)
    at IncomingForm.emit (events.js:185:7)
    at IncomingForm._maybeEnd (C:\Users\murli\NodeProjects\SpeechExpress\node_modules\formidable\lib\incoming_form.js:553:8)
    at C:\Users\murli\NodeProjects\SpeechExpress\node_modules\formidable\lib\incoming_form.js:230:12
    at WriteStream.<anonymous> (C:\Users\murli\NodeProjects\SpeechExpress\node_modules\formidable\lib\file.js:74:5)
    at WriteStream.g (events.js:291:16)
    at emitNone (events.js:91:20)
    at WriteStream.emit (events.js:185:7)

代码

app.use('/uploadFile', function(request, response){

     // parse a file upload
    var mime = require('mime');
    var formidable = require('formidable');
    var util = require('util');

    var form = new formidable.IncomingForm();

    var dir = !!process.platform.match(/^win/) ? '\\public\\uploads\\' : '/public/uploads/';

    form.uploadDir = __dirname + dir;
    console.log("Test 99: " + form.uploadDir);
    form.keepExtensions = true;
    form.maxFieldsSize = 10 * 1024 * 1024;
    form.maxFields = 1000;
    form.multiples = false;
    console.log("Test 100: ");

    form.parse(request, function(err, fields, files) {

        var file = util.inspect(files);
        console.log("form parse file: "+file + "\n" + files);

        response.writeHead(200, getHeaders('Content-Type', 'application/json'));


        var fileName = file.split('path:')[1].split('\',')[0].split(dir)[1].toString().replace(/\\/g, '').replace(/\//g, '');
        var fileURL = 'http://' + app.address + ':' + port + '/public/uploads/' + fileName;

        console.log('fileURL: ', fileURL);

        response.write(JSON.stringify({
            fileURL: fileURL
        }));

        response.end();
    });

});

文件内容

{ file:
   File {
     domain: null,
     _events: {},
     _eventsCount: 0,
     _maxListeners: undefined,
     size: 114898,
     path: 'C:\\Users\\username\\NodeProjects\\SpeechExpress\\public\\uploads\\upload_3c927e85105d0fd5d873e84952821531.webm',
     name: '1234.webm',
     type: 'video/webm',
     hash: null,
     lastModifiedDate: 2017-09-19T22:18:03.330Z,
     _writeStream:
      WriteStream {
        _writableState: [Object],
        writable: false,
        domain: null,
        _events: {},
        _eventsCount: 0,
        _maxListeners: undefined,
        path: 'C:\\Users\\username\\NodeProjects\\SpeechExpress\\public\\uploads\\upload_3c927e85105d0fd5d873e84952821531.webm',
        fd: null,
        flags: 'w',
        mode: 438,
        start: undefined,
        autoClose: true,
        pos: undefined,
        bytesWritten: 114898,
        closed: true } } }

我需要的就是这个

upload_3c927e85105d0fd5d873e84952821531.webm

从这里

C:\\Users\\用户名\\NodeProjects\\SpeechExpress\\public\\uploads\\upload_3c927e85105d0fd5d873e84952821531.webm

最佳答案

此问题有 2 个问题。

第一个是如何从完整目录字符串中提取文件名。因为您使用的是node.js,所以它带有一个方便的函数path.basename(filename)

第二个问题是如何首先获取路径。 Formidable 提供文件,这是一个包含所有文件的简单对象文字。您的文件输入名称似乎名为 file,.. 因此要访问路径,您只需执行 files.file.path.

因此,将这两者组合后,我们得到.. path.basename(files.file.path),您应该获得文件名,在本例中为 -> upload_3c927e85105d0fd5d873e84952821531.webm

关于javascript - app.js 主文件中未定义 toString - NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310522/

相关文章:

javascript - Knex 迁移不会创建任何东西

javascript - 观察 NodeJS 集群是否退出

node.js - 尝试获取 Azure Blob 存储中非公开的文件时,Azure 函数收到 AuthorizationFailure

node.js - 模拟一个 multipart/form-data Express.JS 请求对象

node.js - 哪个 babel 插件声明了这个变量?

javascript - 单击按钮上的动画滑动 div jQuery

javascript - 如何使用来自 React Router 的路由参数发出 axios 请求,然后根据响应更新状态?

node.js - Node 表达+强大+带有multipart/form-data的表单如何获取req.body?

javascript - 事件委托(delegate)给出空值

javascript - 使用 jQuery 将复杂的标点字符串拆分为大于 2 个字符的常规单词