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;
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, '-')
Essayez ce qui suit:
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.
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.