【问题标题】:nodejs and express error when uploading file, "cannot read property of undefined"上传文件时nodejs和表达错误,“无法读取未定义的属性”
【发布时间】:2013-08-31 02:15:05
【问题描述】:

编辑:=== 为清楚起见,我希望将文件上传到服务器,无论是图片还是 .txt ===

我查看了其他类似的常见问题,但无法缓解我的问题。

目的是创建文件上传功能。前端是这样的:

<div class="holdingDiv">
    <form action="/file-upload" name="upload" class="dropzone dz-clickable" id="dropzoneArea" enctype="multipart/form-data">
        <input style="display:none" type="file" name="thumbnail[thumbs]" />                      
        <button id="uploadSubmitter" class="btn btn-primary btn-large" type="submit">Finished</button>
    </form>
</div>

我有表单类型和所有爵士乐设置。

处理 post 请求的 server.js 如下所示:

app.post('/file-upload', imports.upload);

请注意,我还需要以下内容:

//needed for forms
app.use(express.bodyParser()); 

以及调用 imports.upload 导出函数所需的功能。

exports.upload 函数如下所示:

exports.upload = function (req, res) {
    console.log('FIRST TEST: ' + JSON.stringify(req.files));

    console.log('second TEST: ' +req.files.thumbnail.thumbs.name);
    //get the file extenstion:
    //console.log('size' + req.files.thumbnail.size);
  //  console.log('test this: ' + req.files.thumbnail.name);
   // var fileExtension = JSON.stringify(req.files);

    //console.log('Im getting this file type: '+ fileExtension.name);
   // console.log('this: '+req.files.upload);

    //fs.readFile(req.files.uploadFiles.path, function (err, data) {
    //    // ...
    //    var newPath = __dirname + "/uploads/"+uploadFiles.name;
    //    fs.writeFile(newPath, data, function (err) {
    //        res.redirect("back");
    //    });
    //});
}

很多东西都被注释掉了,因为我正在尝试不同的方法来让它工作。我可以用 JSON Stringify 作为一个整体对象来调用它,但我希望它作为一个对象,我可以深入其中并从中获取信息,例如,我想通过将文件名称拆分为“。”来了解文件的类型:

req.files.thumbnail.thumbs.name

但是当我尝试这个(甚至 JSON Stringyfied)时,它说它是未定义的。

我尝试过的事情:

将整个函数移至 app.js(有一个使用 req.body 的小型登录函数,我认为这可能会解决它。

使用 JSON Stringyfy 获取对象的特定部分。 (返回未定义)

我的头撞在键盘上。 (返回未定义)

将表单 enctype 更改为几个不同的东西,但是这里的大多数答案都表明 form-data 是文件上传的最佳 enctype。

任何关于为什么会发生这种情况的帮助和指示将不胜感激!

【问题讨论】:

  • 你想上传一个文件到服务器。对吗?
  • 对,要上传到服务器
  • 我只能在将 method="post" 添加到表单后才能发布。它为你发帖吗?

标签: node.js file-upload express


【解决方案1】:

我不明白您为什么将输入的名称保留为“thumbnails[thumb]”。 您必须将 method = "POST" 添加到您的表单中。

我将 name 属性更改为“theFile”,这里是 html

<div class="holdingDiv">
  <form action="/file-upload" name="upload" class="dropzone dz-clickable" id="dropzoneArea" enctype="multipart/form-data" method = "post">
    <input  type="file" name="theFile" />                      
    <button id="uploadSubmitter" class="btn btn-primary btn-large" type="submit">Finished</button>
  </form>
</div>

现在在您的节点 js 服务器中执行此操作。

app.post('/file-upload',function(req,res){
    console.log('FIRST TEST: ' + JSON.stringify(req.files));
    console.log('second TEST: ' +req.files.theFile.name);
    fs.readFile(req.files.theFile.path, function (err, data) {
        var newPath = "/home/path/to/your/directory/"+req.files.theFile.name;
        fs.writeFile(newPath, data, function (err) {
          res.send("hi");  
        });
    });
});

req.files 是一个 json,它提供了上传请求的详细信息。

希望这会有所帮助。

【讨论】:

  • 这不起作用,我收到以下错误:(控制台日志首次测试包含有关文件的所有信息)第二个错误显示“类型错误:无法读取未定义的属性“名称”我把fs.readfile注释掉了,我现在只想抓取文件信息
  • 不要忘记将 /home/path/to/your/directory/ 更改为任何有效目录。 :)
  • 请删除 style=display:none 并选择一个文件然后上传。
【解决方案2】:

仅供其他人使用 express 4.X 访问此链接。不再支持“多部分”中间件。您需要使用“multiparty”或“multer”等其他中间件。

参考:TypeError: Cannot read property 'image' of undefined

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2023-01-03
    • 2019-05-15
    相关资源
    最近更新 更多