web-dev-qa-db-fra.com

ENOENT: aucun fichier ou répertoire de ce type.?

C’est une erreur que je reçois en postant des données et un fichier .

J'utilise "multer" pour télécharger le fichier 

Le dossier 'uploads' disponible dans le dossier mais il montre

ENOENT: aucun fichier ou répertoire de ce type, ouvrez '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;

produit.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;
5
codedamn

dans product.js

new Date (). toISOString () Derrière ajouter remplacer() changement ":"

Le fichier Windows OS n'accepte pas ":" nommé

sur youtube est le MAC OS

Par exemple

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

14
Miles

Essayez ce qui suit:

  1. Requiert ceci comme une constante ( const path = require ('path'); )
  2. Changer cette ligne

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

Avec ça:

cb(null, path.join(__dirname, '/uploads/'));

Comme je peux le constater, vous essayez d’obtenir un chemin qui n’est pas servi sur le serveur, mais plutôt sur le serveur.

METTRE À JOUR

Essayez aussi de changer cela

app.use('/uploads', express.static('uploads'));

Pour ça:

app.use(express.static(__dirname));

Afin d'exposer le __dirname pour les fichiers statiques.

2
Igor Dimchevski

J'ai trouvé ceci dans la section commentaires, ici: https://www.youtube.com/watch?v=srPXMt1Q0nY&list=PL55RiY5tL51q4D-B63KBnygU6opNPFk_q&index=10

OK les gars, au cas où quelqu'un aurait un problème avec cela lors de la création du fichier stade, cela signifie probablement que vous travaillez sur Windows. Maintenant, vous n'avez pas besoin de se sentir découragé et de jeter votre ordinateur à la corbeille (j’ai en fait l'impression de devoir toujours trouver des solutions de contournement pour mon Windows :).

Il y a au moins une solution, et c'est celle que j'ai trouvée. Mon problème Si le fichier n'est pas créé, Windows n'accepte pas le fichier noms de fichiers avec deux points (':') dessus. Ma solution est plutôt simple. Après J'obtiens la date actuelle, j'utilise replace () et une expression rationnelle pour changer cela dans un tiret. Alto. Ça marche!

Juste au cas où, c’est une façon de le faire: nom du fichier: fonction (req, fichier, cb) { const now = new Date (). toISOString (); const date = now.replace (/:/g, '-'); cb (null, date + fichier.nom_original); }

J'espère que ça aide quelqu'un qui travaille dans Windows.

1
Jorge