这是发布数据和文件时出错的错误。 我已经按照'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)}
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;
答案 0 :(得分:19)
in product.js
new Date()。toISOString()后面添加替换()更改":"
Windows操作系统文件不接受":" 命名为
youtube上的是MAC OS
E.g
new Date()。toISOString()。replace(/:/ g,' - ')
答案 1 :(得分:2)
尝试以下方法:
更改此行
cb(null,'。/ uploads /');
有了这个:
cb(null, path.join(__dirname, '/uploads/'));
正如我所看到的,您正在尝试获取服务器上未提供的路径,而是服务器计算机上的路径。
<强>更新强>
也请尝试更改此
app.use('/uploads', express.static('uploads'));
对此:
app.use(express.static(__dirname));
为了公开静态文件的__dirname。
答案 2 :(得分:2)
这对我有用。我将“ ./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);
}
});
由于设置了特定的文件夹名称/目录,因此将图像目录限制为仅或应位于该文件夹中。
答案 3 :(得分:1)
我在评论部分找到了这个内容:https://www.youtube.com/watch?v=srPXMt1Q0nY&list=PL55RiY5tL51q4D-B63KBnygU6opNPFk_q&index=10
好的家伙,万一有人在文件创建中遇到此问题 阶段,这可能意味着你正在使用Windows。现在,你没有 需要感到气馁,把你的电脑扔进垃圾桶(我 实际上总是要为我的Windows找到变通方法:)。
至少有一个解决方案,这就是我找到的解决方案。我的问题 是否因为Windows不接受而无法创建文件 文件名上有冒号(':')。我的解决方案很简单。后 我得到当前日期,我使用replace()和正则表达式来改变它 变成破折号。中提琴。它有效!
以防万一,这是一种方法: filename:function(req,file,cb){ const now = new Date()。toISOString(); const date = now.replace(/:/ g,' - '); cb(null,date + file.originalname); }
希望能帮助在Windows工作的人。
答案 4 :(得分:1)
我正在做同样的课程,我也遇到了同样的问题(我也使用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);
}
});
这也会为文件名创建一个唯一的哈希
答案 5 :(得分:1)
我有一个类似的错误,这就是我的解决方法。使用替换方法后,我将“ ./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用户。
答案 6 :(得分:1)
在保存文件时遇到了相同的错误。 我在回调函数中提供的路径已经不存在,这就是为什么我收到该错误
<body>
<h1 id="h1">ToDo Lijst</h1>
<label for="item">Titel</label><br>
<input type="text" id = "Item"><br><br>
<!--<p style="color:red; font-size:18px;" id="FoutInput"></p>-->
<label for = "aantal">Omschrijving</label><br>
<input class="desc" type="text" id="description"><br><br>
<label for="person">Toegewezen Person</label><br>
<input type="text" id = "person"><br><br>
<label for="deadline">Deadline</label><br>
<input type="text" id="deadline">
<button type = "button" onclick="Toevoegen()"><span>+</span></button>
<button type="button" onclick="Edit()" >Aanpassen</button>
<button style="background-color: crimson" onclick="Verwijderen()"><i class="fa fa-trash-o"></i></button>
<p style="color:red; font-size:15px;" id="FoutInput"></p>
<table id="table">
<tr>
<th>Titel</th>
<th>Toegewezen Person</th>
<th>Deadline</th>
</tr>
</table>
使用文件系统,我创建了相同的文件夹,如果文件夹存在, err 会获得价值,但是这里有了这个文件夹,无需担心。 这对我有用。希望这会有所帮助
答案 7 :(得分:1)
因此答案在youtube上的教程评论部分中。 代替:
cb(null, new Date().toISOString() + file.originalname);
做:
cb(null, Date.now() + file.originalname);
简单为
答案 8 :(得分:0)
您应该更改文件名。因为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);
}
});
答案 9 :(得分:0)
我认为,如果您使用Windows操作系统,则应该使用Date().i
的另一种方法编写如下代码:
filename:(req,file,cb)=>{ cb(null,new Date().toDateString()+file.originalname) }
答案 10 :(得分:0)
您无权访问此服务器上的/ uploads/。
尝试以下操作:
sudo chmod -R 777 /uploads
答案 11 :(得分:0)
在app.js文件附近创建文件夹上传
此行
app.use('/uploads', express.static('uploads'));
答案 12 :(得分:0)
一切都很好。问题在这条线上
cb(null, new Date().toISOString() + file.originalname);
只需写cb(null,file.originalname);
它会工作。尝试以其他方式使用带有文件名的日期字符串。
答案 13 :(得分:0)
注意:为了删除所有特殊字符,我们可以将替换功能用作
const cleanVariable = mixSpecialCharters.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');
答案 14 :(得分:0)
为防止"error": "ENOENT: no such file or directory
使用此=>
cb(null, Date.now() + file.originalname);
代替
cb(null, new Date().toISOString() + file.originalname);
答案 15 :(得分:0)
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);
}
});
答案 16 :(得分:0)
如果找不到文件夹,您可以创建一个
destination: function(req, file, cb) {
fs.mkdir('./uploads/',(err)=>{
cb(null, './uploads/');
});
},