web-dev-qa-db-fra.com

Comment stocker un fichier avec l'extension de fichier avec multer?

Géré pour stocker mes fichiers dans un dossier, mais ils stockent sans l'extension de fichier.

Quelqu'un sait-il comment enregistrer le fichier avec une extension de fichier?

17
user3355603

Dans la documentation: "Multer n’ajoutera aucune extension de fichier pour vous, votre fonction doit renvoyer un nom de fichier complet avec une extension."

Voici comment vous pouvez ajouter l'extension:

var multer = require('multer');

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + '.jpg') //Appending .jpg
  }
})

var upload = multer({ storage: storage });

Je recommanderais d'utiliser la propriété mimetype pour déterminer l'extension. Par exemple:

filename: function (req, file, cb) {
  console.log(file.mimetype); //Will return something like: image/jpeg

Plus d'infos: https://github.com/expressjs/multer

27
Scott

Désolé, je ne peux pas commenter la réponse de Scott ci-dessus, mais j'ai une solution de contournement pour ajouter l'extension appropriée de fichiers. Si vous utilisez le module de noeud path

var multer = require('multer');
var path = require('path')

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + path.extname(file.originalname)) //Appending extension
  }
})

var upload = multer({ storage: storage });
40
srijishks

J'ai eu l'extension de fichier depuis file.mimetype ..____. J'ai divisé le type MIME et obtenu l'extension de fichier.

let storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './uploads')
  },
  filename: function (req, file, cb) {
    let extArray = file.mimetype.split("/");
    let extension = extArray[extArray.length - 1];
    cb(null, file.fieldname + '-' + Date.now()+ '.' +extension)
  }
})
const upload = multer({ storage: storage })
8

En 2018, c'est fait comme ça:

var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, config.DIR)
    },
    filename: function (req, file, cb) {
        let ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
        cb(null, Date.now() + ext)
    }
});
const upload = multer({
    storage: storage
}).any();
4
Zohaib Aslam

J'ai utilisé cette astuce pour obtenir une extension de fichier et comme solution de contournement pour contourner les problèmes pouvant survenir lorsque quelqu'un télécharge un fichier portant un nom de fichier similaire deux fois ou qui existe sur le serveur.

const crypto = require('crypto')
let upload = multer({
storage: multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, path.join(__dirname, '../uploads'))
    },
    filename: (req, file, cb) => {
        // randomBytes function will generate a random name
        let customFileName = crypto.randomBytes(18).toString('hex')
        // get file extension from original file name
        let fileExtension = file.originalname.split('.')[1]
        cb(null, customFileName + '.' + fileExtension)
    }
  })
})
3
Danny Sofftie

Il peut y avoir des problèmes dans les codes déjà répondus.

  • Il peut y avoir des cas de fichiers sans extension.
  • Il ne devrait pas y avoir d'utilisation de upload.any(). Son vulnérable aux assaillants
  • La fonction de téléchargement doit ne pas être globale.

J'ai écrit les codes ci-dessous pour une meilleure sécurité.

var storage = multer.diskStorage({
    destination: function (req, file, cb) {

        cb(null, 'temp/')
    },
    filename: function (req, file, cb) {
        let ext = ''; // set default extension (if any)
        if (file.originalname.split(".").length>1) // checking if there is an extension or not.
            ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
        cb(null, Date.now() + ext)
    }
})
var upload = multer({ storage: storage });

Utilisation pour le téléchargement 

// using only single file object name (HTML name attribute)
// May use upload.array(["file1","file2"]) for more than one
app.post('/file_upload', upload.single("file"), function (req,res) {
    //console.log(req.body, 'Body');
    console.log(req.file, 'file');
    res.send("cool");
})
2
Durgesh Satyam

Je fais comme ça

var multer  = require('multer');

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './public/uploads/img/')
  },
  filename: function (req, file, cb) {
    let ext = file.originalname.substring(file.originalname.lastIndexOf('.'), file.originalname.length);
    cb(null, Date.now() + ext);
  }
})

var upload = multer({ storage: storage }).single('eventimage');
0
NewUser

Une manière orientée objet de stocker une image avec un nom unique

// image.service.ts
import { diskStorage, StorageEngine } from "multer";

class ImageStorageService {

    storage: StorageEngine
    constructor() {
        const MIME_TYPE_MAP = {
            'image/png': 'png',
            'image/jpeg': 'jpg',
            'image/jpg': 'jpg'
        }

        this.storage = diskStorage({
            destination: (req, file, callback) => {
                const isValid = MIME_TYPE_MAP[file.mimetype]
                let error = new Error(`Invalid mime type`)
                if (isValid)
                    error = null

                //app.use(express.static(path.join(`${__dirname}/assets`)))
                callback(error, 'assets/images')
            },
            filename: (req, file, callback) => {
                let currentFileName: string = file.originalname.substr(0, file.originalname.lastIndexOf('.'))
                const name = currentFileName.toLowerCase().split(' ').join('-')
                const ext = MIME_TYPE_MAP[file.mimetype]
                callback(null, `${name}-${Date.now()}.${ext}`)
            }
        })
    }
}

export const ImageStorage = new ImageStorageService().storage

puis dans un de vos itinéraires

import { ImageStorage } from "./services/image-storage.service";

this.router.post('/signup', multer({ storage: ImageStorage }).single('image'), async (req, res, next) => {
    let img_url: string
    if (req.file) {
        const url: string = `${req.protocol}:\/\/${req.get('Host')}`
        img_url = url + '/images/' + req.file.filename
        //http://localhost:3000/images/penguins-1548339248380.jpg
    }
})
0
WasiF