繁体   English   中英

Express express-fileupload ENOENT:没有这样的文件或目录,打开'public/images/name.ext

[英]Express express-fileupload ENOENT: no such file or directory, open 'public/images/name.ext

我遇到了这个错误 ENOENT: no such file or directory, open 'public/images/name.ext from express-fileupload 我知道有很多相同的问题,但对我来说似乎解决方案不适用于我发现的问题此处: 使用 Express-fileupload 上传文件时没有此类文件或目录错误 - Node.js

没有这个: ENOENT:没有这样的文件或目录。?

而且我仍然收到此错误。 我不确定它是目录公共声明还是 mv('directory specification') 或文件名。 肯定有问题

这是我的项目文件夹结构:在此处输入图像描述

这是我的 app.js 文件

const express = require('express');
const cors = require('cors');
const fileUpload = require('express-fileupload')
const passport = require("passport");
const path = require("path");

const {db} = require("./database/db");
const authMiddleware = require('./app/middleware/authMiddleware')

const app = express();
// app.use(express.static(path.join(__dirname, "./public/")));
app.use(express.static(__dirname));
// app.use(express.static('public'))
// app.use('/public', express.static('public'));

// console.log('static path', express.static('public'))
app.use(fileUpload())


app.use('/api/asset/:assetId/uploadimage', async(req, res, next) => {
    const file = req.files.file;
    console.log('files bs',file)
    try{
        if(file === null){
            throw new Error('Not file Specified')
        }
        // await file.mv(path.join(__dirname, `public/images/${file.name}`))
        // await file.mv('public/image/' + file.name)

        await file.mv('public/images/' + file.name)

        res.status(200).json({fileName: file.name, filePath: `/uploads/${file.name}`});
    }
    catch(err){
        console.log(err)
        return res.status(400).send(err.message);
    }
})

您可以看到注释代码,这些是我也尝试过的方法,但它们不起作用:(

这是错误:

node_1   | files bs {
node_1   |   name: '20191009_122021.jpg',
node_1   |   data: <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 48 00 48 00 00 ff e1 02 8a 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 09 01 0f 00 02 00 00 00 08 00 00 ... 1488306 more bytes>,
node_1   |   size: 1488356,
node_1   |   encoding: '7bit',
node_1   |   tempFilePath: '',
node_1   |   truncated: false,
node_1   |   mimetype: 'image/jpeg',
node_1   |   md5: 'd2855d664bd5e5565a45da1ae06bd1ee',
node_1   |   mv: [Function: mv]
node_1   | }
node_1   | [Error: ENOENT: no such file or directory, open 'public/images/20191009_122021.jpg'] {
node_1   |   errno: -2,
node_1   |   code: 'ENOENT',
node_1   |   syscall: 'open',
node_1   |   path: 'public/images/20191009_122021.jpg'
node_1   | }

请帮忙:)

更新那些上传 FUNCTION 不在 INDEX.JS 文件中的人,例如 /APP_NAME/ROUTES 或 /APP_NAME/SERVER/SRC/ROUTE/ROUTE.JS(mern_stack 版本)

所以就我而言,我已经在/app/controllers/文件夹中上传了 function

我的 controller 文件位置结构:

/my_app_name/server/src/app/controllers/FileUploader.js

我的根服务器/索引文件位置:

/my_app_name/server/src/app.js

为了指定我要存储图像的公共/图像的位置:

/my_app_name/server/src/public/images

/my_app_name/server/src/app/controllers/FileUploader.js我不得不使用require('path')

这就是它的样子:

const path = require("path");

const addImages = async(req, res, next) => {
    const file = req.files.file;
    console.log('files',file)
    try{
        if(file === null){
            throw new Error('Not file Specified')
        }
        await file.mv(path.join(path.dirname('/app/server/src/'), '/src/public/images/') + file.name)

        res.status(200).json({fileName: file.name, filePath: `/public/images/${file.name}`});
    }
    catch(err){
        console.log(err)
        return res.status(400).send(err.message);
    }
}

解释为什么我必须使用path.join()path.dirname()

基本上我一般不能使用(path.join(__dirname, "./public/images"))__dirname ,因为它会告诉我 FileUploader.js 所在的路径,即/my_app_name/server/src/app/controllers/然后如果我要添加"./public/images" ,它会查看/my_app_name/server/src/app/controllers/public/images因此我们需要指定path.dirname()在哪里你的根节点文件夹在我的情况下是path.dirname('/app/server/src/')因为我有这样草率的 MERN 堆栈结构与 docker

和 rest 你只需要将你的目录名与你的公共/图像位置加入,即path.join(path.dirname('/app/server/src/'), '/src/public/images/')

所以所有这些都必须await file.mv(path.join(path.dirname('/app/server/src/'), '/src/public/images/') + file.name) (如果你有像我一样邋遢的 MERN 堆栈结构:) )

我希望它可以帮助某人:快乐的极客! :)

从我自己更新。 我设法解决了这个问题。

似乎节点不喜欢这种用 `` 重音符号指定路径的语法,因此它给了我错误。 所以对于那些仍在努力尝试指定这样的路径的人。

await file.mv(path.join(__dirname, 'public/images/') + file.name)

更新:确保在您的公用文件夹中有指定的路径。 澄清一下,您需要创建第一个目录 your_project_name/public/images/

在我的情况下

mern
 -server
   -src
     -public
       -images

     app.js

  serve.package.json
 -client
  -src

当我尝试这样做时,我也遇到了同样的错误,但是当我们给出 ex 的路径时,我们写__dirname ,我在我的根目录中创建了一个upload部分,但是__dirname正在访问内部文件,就像它不是访问rootfolder/upload ,但它正在访问rootfolder/server/controllers/upload ,这是我工作的路径,这意味着__dirname正在访问错误的路径,这就是发生此错误的原因。

解决方案是

exports.serviceDataUpload = (req, res) => {
let sampleFile; // 
let uploadpath;
if (!req.files || Object.keys(req.files).length === 0) {
    return res.status(400).send('No file were uploaded')
} // If user has not uploaded any thing
sampleFile = req.files.uploadImg; //Getting file from body
uploadpath = 'C:/Users/Rahul/Desktop/Coding Projects/Prompt/upload/' + sampleFile.name; //Here is the main error accurring, write it the way i have written
sampleFile.mv(uploadpath, function (err) {
    if (err) return res.status(500).send(err);
    res.send('File Uploaded!')
});

}

您可以看到我是如何编写uploadPath的,不要 go 与__dirname只是简单地编写完整路径并将其与对象的键连接。 所以在我的例子中,它的sampleFile.name

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM