ENOENT:没有这样的文件或目录。?
Posted
技术标签:
【中文标题】ENOENT:没有这样的文件或目录。?【英文标题】:ENOENT: no such file or directory .? 【发布时间】:2018-07-03 06:34:36 【问题描述】:这是发布数据和文件时出现的错误。 我已按照“academind”教程构建 Restful API 服务,我也一直在寻找此类错误的答案,但对我没有任何帮助。
我正在使用“multer”上传文件
文件夹中的“上传”文件夹可用,但它显示
ENOENT:没有这样的文件或目录,打开 'D:\project\uploads\2018-01-24T07:41:21.832Zcheck.jpg'"
app.js
const express = require("express");
const app = express();
const morgan = require("morgan");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const productRoutes = require("./api/routes/products");
mongoose.connect('',
(err)=>
if(err)console.log(err)
elseconsole.log('DB Connected')
)
mongoose.Promise = global.Promise;
app.use(morgan("dev"));
app.use('/uploads', express.static('uploads'));
app.use(bodyParser.urlencoded( extended: false ));
app.use(bodyParser.json());
app.use((req, res, next) =>
res.header("Access-Control-Allow-Origin", "*");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Authorization"
);
if (req.method === "OPTIONS")
res.header("Access-Control-Allow-Methods", "PUT, POST, PATCH, DELETE, GET");
return res.status(200).json();
next();
);
// Routes which should handle requests
app.use("/products", productRoutes);
app.use((req, res, next) =>
const error = new Error("Not found");
error.status = 404;
next(error);
);
app.use((error, req, res, next) =>
res.status(error.status || 500);
res.json(
error:
message: error.message
);
);
module.exports = app;
product.js
const express = require("express");
const router = express.Router();
const mongoose = require("mongoose");
const multer = require('multer');
const storage = multer.diskStorage(
destination: function(req, file, cb)
cb(null, './uploads/');
,
filename: function(req, file, cb)
cb(null, new Date().toISOString() + file.originalname);
);
const fileFilter = (req, file, cb) =>
// reject a file
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png')
cb(null, true);
else
cb(null, false);
;
const upload = multer(
storage: storage,
limits:
fileSize: 1024 * 1024 * 5
,
fileFilter: fileFilter
);
router.post("/", checkAuth, upload.single('productImage'), (req, res, next) =>
const product = new Product(
_id: new mongoose.Types.ObjectId(),
name: req.body.name,
price: req.body.price,
productImage: req.file.path
);
product
.save()
.then(result =>
console.log(result);
res.status(201).json(
message: "Created product successfully",
createdProduct:
name: result.name,
price: result.price,
_id: result._id,
request:
type: 'GET',
url: "http://localhost:3000/products/" + result._id
);
)
.catch(err =>
console.log(err);
res.status(500).json(
error: err
);
);
);
module.exports = router;
【问题讨论】:
根据this page,文件名中不允许使用冒号(:
)。尝试删除它(product.js
中的第 11 行)。
【参考方案1】:
在 product.js 中:
在 new Date().toISOString()
之后添加 replace()
以将 ":" 更改为可接受的字符。
Windows 操作系统不接受带有 ":"
的文件Youtube 上的人正在使用 MAC OS
例如
new Date().toISOString().replace(/:/g, '-')
【讨论】:
谢谢你。有同样的问题,这为我解决了它 这个答案值得更多的支持。【参考方案2】:尝试以下方法:
-
要求将此作为常量 (const path = require('path');)
改变这一行
cb(null, './uploads/');
有了这个:
cb(null, path.join(__dirname, '/uploads/'));
如我所见,您正在尝试获取不在服务器上的路径,而是在服务器机器上的路径。
更新
尝试同时更改此设置
app.use('/uploads', express.static('uploads'));
到这里:
app.use(express.static(__dirname));
为了暴露静态文件的__dirname。
【讨论】:
我添加了 'cb(null, 'D:/project/uploads');'但还是一样 不要使用 'D:/project/uploads',使用 __dirname 全局对象。 nodejs.org/docs/latest/api/modules.html#modules_dirname 同样的错误,console.log(__dirname) 结果 D:\project 错误一定是 express.static 无法为静态文件托管您的文件夹 非常感谢。为我节省了许多小时的压力。添加 next(null, path.join(__dirname, '.././public/uploads/images/'));工作【参考方案3】:这对我有用。我将 './uploads/' 更改为 '__dirname' 以便它可以在您计算机上的任何位置找到正确的目录/文件名。
const storage = multer.diskStorage(
destination: function(req, file, cb)
cb(null, __dirname);
,
filename: function(req, file, cb)
cb(null, new Date().toISOString() + file.originalname);
);
因为当您设置特定的文件夹名称/目录时,您将图像目录限制为仅或应该在该文件夹中。
【讨论】:
谢谢。它正在工作。【参考方案4】:我正在做同样的课程,我也有同样的问题(我也使用 Windows 机器)。以下对我有用:
const hash = require('random-hash'); // you have to install this package:
const fileStorage = multer.diskStorage(
destination: (req, file, callback) => //this is storing the file in the images folder
callback(null, path.join(__dirname, '/Images'));
,
filename: (req, file, callback) => //this is just setting a unique filename
let temp = file.originalname.split('.');
const filename = temp[0] + '-' + hash.generateHash(length: 5) + '.' + temp[1]
callback(null, filename);
);
这也会为文件名创建一个唯一的哈希
【讨论】:
您也可以使用节点内置的加密库来生成哈希。因此,您不必添加另一个依赖项。crypto.randomBytes(16).toString("hex")
-> 该位将生成哈希【参考方案5】:
我在 cmets 部分找到了这个,这里:https://www.youtube.com/watch?v=srPXMt1Q0nY&list=PL55RiY5tL51q4D-B63KBnygU6opNPFk_q&index=10
好的,如果有人在创建文件时遇到问题 阶段,这可能意味着您正在使用 Windows。现在,你不 需要感到气馁,把你的电脑扔进垃圾桶(我 实际上就像总是必须为我的 Windows 找到解决方法:)。
至少有一个解决方案,这是我找到的。我的问题 是因为 Windows 不接受文件没有被创建 带有冒号 (':') 的文件名。我的解决方案相当简单。后 我得到当前日期,我使用 replace() 和一个正则表达式来改变它 成破折号。中提琴。有效!
以防万一,这是一种方法: 文件名:函数(请求,文件,cb) const now = new Date().toISOString(); const date = now.replace(/:/g, '-'); cb(null, date + file.originalname);
希望它对在 Windows 中工作的人有所帮助。
【讨论】:
【参考方案6】:所以答案在 youtube 上的教程 cmets 部分。 而不是:
cb(null, new Date().toISOString() + file.originalname);
做:
cb(null, Date.now() + file.originalname);
简单。
【讨论】:
【参考方案7】:使用 this = > cb(null, Date.now() + file.originalname);
而不是 cb(null, new Date().toISOString() + file.originalname);
来防止
"error": "ENOENT: no such file or directory
【讨论】:
【参考方案8】:一切都很好。问题出在这条线上
cb(null, new Date().toISOString() + file.originalname);
只需写cb(null,file.originalname);
它会起作用的。尝试以不同的方式使用文件名添加日期字符串。
【讨论】:
【参考方案9】:您应该更改文件名。因为 Windows 中不允许使用 ':'。
例如:
const storage = multer.diskStorage(
destination: function(req, file, cb)
cb(null,'./uploads/');
,
filename: function(req,file,cb)
cb(null, new Date().toISOString().replace(/:/g, '-') +'-'+ file.originalname);
);
【讨论】:
【参考方案10】:我在保存文件时遇到了同样的错误。 我在回调中提供的路径不存在,这就是我收到该错误的原因
const fs = require('fs');
const storage = multer.diskStorage(
destination: function(req, file, cb)
fs.mkdir('./uploads/',(err)=>
cb(null, './uploads/');
);
,
filename: function(req, file, cb)
cb(null, new Date().toISOString() + file.originalname);
);
使用文件系统我创建了相同的文件夹,如果文件夹存在,err 会获得价值,但这里没有什么可担心的,因为我们有那个文件夹。 这对我有用。希望这会有所帮助
【讨论】:
是的......我花了一个小时才弄清楚该文件夹应该已经存在,然后它才保存文件。【参考方案11】:我认为如果您使用 Windows 操作系统,您应该使用Date().i
的另一种方法编写代码:
filename:(req,file,cb)=> cb(null,new Date().toDateString()+file.originalname)
【讨论】:
【参考方案12】:我遇到了类似的错误,这就是我解决它的方法。使用替换方法后,我将 './uploads/images/' 更改为 'uploads/images'。在这种情况下,multer 自动创建了该文件夹。所以你有这样的东西
const storage = multer.diskStorage(
destination: function(req, file, cb)
cb(null, 'uploads/');
,
filename: function(req, file, cb)
cb(null, new Date().toISOString().replace(/:/g, '-')+ file.originalname);
);
对于 Windows 用户。
【讨论】:
【参考方案13】:在 app.js 文件附近创建文件夹 uploads
对于这一行
app.use('/uploads', express.static('uploads'));
【讨论】:
【参考方案14】:如果找不到文件夹,那么您可以创建一个
destination: function(req, file, cb)
fs.mkdir('./uploads/',(err)=>
cb(null, './uploads/');
);
,
【讨论】:
【参考方案15】:在这里,许多其他人都非常接近,我确信某些答案对某些人有用,但是我发现here 对我有用(为此苦苦挣扎)现在 2 周)。
const storage = multer.diskStorage(
destination: function (req, file, cb)
cb(null, path.resolve(__dirname, './test'))
,
filename: function (req, file, cb)
cb(null, file.originalname)
)
【讨论】:
【参考方案16】:您无权访问此服务器上的 /uploads/。
尝试以下方法:
sudo chmod -R 777 /uploads
【讨论】:
【参考方案17】:注意:为了去除所有特殊字符,我们可以使用替换功能
const cleanVariable = mixSpecialCharters.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\\\[\]\\\/]/gi, '');
【讨论】:
【参考方案18】:const storage = multer.diskStorage(
destination: function(req, file, cb)
-cb(null, './uploads/');
+cb(null, 'upload/');
,
filename: function(req, file, cb)
cb(null, new Date().toISOString() + file.originalname);
);
【讨论】:
添加更多细节【参考方案19】:在 product.js 中只需将 cb(null, new Date().toISOString()+ file.originalname) 替换为 cb(null, Date.now() + "-" + file.originalname);
【讨论】:
【参考方案20】:只是改变
cb(null, new Date().toISOString() + file.originalname);
与
cb(null, Date.now() + file.originalname);
【讨论】:
以上是关于ENOENT:没有这样的文件或目录。?的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins 并行阶段 - enoent ENOENT:没有这样的文件或目录