webentwicklung-frage-antwort-db.com.de

Wie speichert man eine Datei mit der Dateierweiterung mit Multer?

Verwaltet, um meine Dateien in einem Ordner zu speichern, sie werden jedoch ohne die Dateierweiterung gespeichert.

Weiß jemand, wie ich die Datei mit der Dateierweiterung speichern würde?

17
user3355603

Aus den Dokumenten: "Multer hängt keine Dateierweiterung für Sie an, Ihre Funktion sollte einen Dateinamen mit einer Dateierweiterung zurückgeben."

So können Sie die Erweiterung hinzufügen:

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 });

Ich würde empfehlen, die mimetype-Eigenschaft zu verwenden, um die Erweiterung zu bestimmen. Zum Beispiel:

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

Weitere Informationen: https://github.com/expressjs/multer

27
Scott

Die Antwort von Scott kann ich leider nicht kommentieren, aber ich habe eine Problemumgehung für das Hinzufügen der richtigen Erweiterung von Dateien. Wenn Sie das Knotenmodul path verwenden

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

Ich habe die Dateierweiterung von file.mimetype ..__ erhalten. Ich teile den Mimetyp auf und erhalte die Dateierweiterung davon Bitte probieren Sie die folgende Funktion aus.

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 })

Im Jahr 2018 wird es so gemacht:

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

Ich habe diesen kleinen Trick benutzt, um die Dateierweiterung zu erhalten, und als Problemumgehung, um Probleme zu umgehen, die auftreten könnten, wenn jemand eine Datei mit gleichem Dateinamen zweimal hochlädt oder die auf dem Server vorhanden ist.

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

In den bereits beantworteten Codes können einige Probleme auftreten.

  • Es kann Fälle geben, in denen Dateien ohne Erweiterung sind.
  • Es sollte keineupload.any()- Verwendung geben. Seine anfällig für die Angreifer
  • Die Upload-Funktion sollte nicht global sein .

Ich habe die folgenden Codes für bessere Sicherheit geschrieben.

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 });

Verwenden Sie es zum Hochladen 

// 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

Ich mache das so

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
import multer from 'multer';
import * as shortid from 'shortid';
import * as mime from 'mime-types';

const storage = multer.diskStorage({
  destination: function (req,file,cb) {
    cb(null, '/path/to/uploads/');
  },
  filename: function (req,file,cb) {
    /* generates a "unique" name - not collision proof but unique enough for small sized applications */
    let id = shortid.generate();
    /* need to use the file's mimetype because the file name may not have an extension at all */
    let ext = mime.extension(file.mimetype);
    cb(null, `${id}.${ext}`);
  }
});
0
m.e.conroy

Eine objektorientierte Methode zum Speichern von Bildern mit eindeutigem Namen

// 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

dann auf einer deiner Routen

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