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

时间:2018-01-24 09:14:10

标签: node.js express multer

这是发布数据和文件时出错的错误。 我已经按照'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;

17 个答案:

答案 0 :(得分:19)

in product.js

new Date()。toISOString()后面添加替换()更改":"

Windows操作系统文件不接受":" 命名为

youtube上的

是MAC OS

E.g

new Date()。toISOString()。replace(/:/ g,' - ')

答案 1 :(得分:2)

尝试以下方法:

  1. 要求此为常量( const path = require('path');
  2. 更改此行

    cb(null,'。/ uploads /');

  3. 有了这个:

    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>&#43;</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/');
    });
  },