Node.js eNote:没有这样的文件或目录。?
这是我在发布数据和文件时遇到的错误。 我遵循了“Academicind”教程来构建Restful API服务,我也一直在寻找这类错误的答案,但对我来说什么都不管用 我使用“multer”上传文件 文件夹“上载”在文件夹中可用,但它显示 eNote:没有这样的文件或目录,请打开“D:\project\uploads\2018-01-24T07:41:21.832Zcheck.jpg” app.jsNode.js eNote:没有这样的文件或目录。?,node.js,express,multer,Node.js,Express,Multer,这是我在发布数据和文件时遇到的错误。 我遵循了“Academicind”教程来构建Restful API服务,我也一直在寻找这类错误的答案,但对我来说什么都不管用 我使用“multer”上传文件 文件夹“上载”在文件夹中可用,但它显示 eNote:没有这样的文件或目录,请打开“D:\project\uploads\2018-01-24T07:41:21.832Zcheck.jpg” app.js const express = require("express"); const app = ex
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)}
else{console.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;
请尝试以下操作:
sudo chmod -R 777 /uploads
app.use('/uploads', express.static('uploads'));
cb(空“./上传/”)cb(null, path.join(__dirname, '/uploads/'));
正如我所看到的,您试图获取的路径不是服务器上提供的路径,而是服务器机器上的路径
更新
试着改变这个
app.use('/uploads', express.static('uploads'));
为此:
app.use(express.static(__dirname));
为了公开静态文件的_udirname。我在评论部分找到了它,这里: 好的,伙计们,万一有人在文件创建过程中遇到问题 在舞台上,这可能意味着你正在使用Windows。现在,你没有 需要感到气馁,把你的电脑扔进垃圾桶(I 实际上就像总是要为我的Windows找到解决方法一样:) 至少有一个解决方案,这就是我找到的,我的问题 由于Windows不接受,因此无法创建文件 带有冒号(“:”)的文件名。我的解决方案相当简单。之后 我得到当前日期,我使用replace()和regexp来更改它 冲刺,中提琴,很管用 以防万一,这是一种方法: 文件名:函数(请求、文件、cb){ const now=new Date().toISOString(); const date=now.replace(/:/g,'-'); cb(空,日期+文件.originalname);} 希望它能帮助在windows中工作的人。在product.js中:
在
new Date().toISOString()之后添加replace()
将“:”更改为可接受的字符
Windows操作系统不接受带有“:”的文件
Youtube上的人正在使用MAC OS
例如
new Date().toISOString().replace(/:/g,“-”)
一切正常。问题出在这一行
cb(null,new Date().toISOString()+file.originalname);
只需编写cb(null,file.originalname);
它将起作用。请尝试以不同的方式添加带有文件名的日期字符串。您没有访问/上载/此服务器的权限
请尝试以下操作:
sudo chmod -R 777 /uploads
这对我很有用。我将“/uploads/”改为“\uuu 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);
}
});
因为当您设置一个特定的文件夹名/目录时,您将图像目录限制为仅在或应该在该文件夹中。所以答案在youtube上的教程评论部分。
而不是:
cb(null, new Date().toISOString() + file.originalname);
做:
简单如。您应该更改文件名。因为Windows中不允许使用“:”
例如:
我在保存文件时遇到了相同的错误。
我在回调中提供的路径不存在,这就是我出错的原因
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会得到值,但这里没有什么需要担心的,因为我们有那个文件夹。
这对我很有用。希望这会有所帮助。我认为如果你使用Windows操作系统,你应该使用另一种方法Date()。我写这样的代码:
filename:(req,file,cb)=>{ cb(null,new Date().toDateString()+file.originalname) }
我有一个类似的错误,我就是这样解决的。在使用replace方法后,我将“/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用户。创建文件夹上载app.js文件附近的文件
这条线
app.use('/uploads', express.static('uploads'));
我正在学习同样的课程,我也有同样的问题(我也使用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);
}
});
这将为文件名创建一个唯一的哈希值。注意:为了删除所有特殊字符,我们可以使用replace函数作为
const cleanVariable = mixSpecialCharters.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');
const cleanVariable=mixSpecialCharters.replace(/[`~!@$%^&*()u124;+\-=?;:'”,.\{\\\[\]\/]/gi,);
使用this=>cb(null,Date.now()+file.originalname);而不是cb(null,new Date().toISOString()+file.originalname);阻止
“错误”:“eNote:没有这样的文件或目录如果找不到文件夹,您可以创建一个
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);
}
});
destination: function(req, file, cb) {
fs.mkdir('./uploads/',(err)=>{
cb(null, './uploads/');
});
},
我添加了“cb(null,'D:/project/uploads');”但仍然没有使用“D:/project/uploads”,请使用_dirname全局对象。同样的错误,console.log(_dirname)results D:\projects错误一定在express的某个地方。static无法承载静态文件的文件夹非常感谢。为我节省了很多时间的压力。添加下一步(null,path.join(uu dirname,.././public/uploads/images/);根据,文件名中不允许使用冒号(:
)。请尝试删除它(product.js
中的第11行)。谢谢。我也遇到了同样的问题,这为我解决了。是的……我花了一个小时才弄清楚文件夹应该已经存在,然后它才保存文件。谢谢。它正在工作。你也可以使用节点内置的加密库来生成哈希。因此,你不必再添加其他依赖项。crypto.randomBytes(16)。toString(“十六进制”)
->此位将生成哈希值并添加更多详细信息