it-swarm.com.de

Das Umbenennen einer hochgeladenen Datei mit Multer funktioniert nicht (Express.js)

Ich versuche, eine Datei aus einem HTML-Formular mit Express.js und Multer hochzuladen. Es ist mir gelungen, die Datei am gewünschten Ort zu speichern (ein Ordner mit dem Namen uploads).

Ich möchte die Datei jedoch beim Hochladen umbenennen, da Multer der Datei standardmäßig einen merkwürdigen Namen gibt, z.

5257ee6b035926ca99923297c224a1bb

Könnte ein hexadezimaler Zeitstempel sein oder so, aber ich brauche einen expliziteren Namen, um später ein Skript darauf aufzurufen.

Ich bin der Erklärung gefolgt, die hier gefunden hat, aber es tut nichts weiter als früher: Laden der Datei mit dem Hexanamen.

Außerdem scheinen die beiden Ereignisse onFileUploadStart und onFileUploadComplete nie ausgelöst zu werden, da in meiner Konsole nichts protokolliert wird.

Ich verwende zwei separate Dateien für den Server und das Routing:

app.js

/**
 * Dependencies
 */

var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

/**
 * Importation of routes
 */
var routes = require('./routes/index');
var recog = require('./routes/recog');

/**
 * Express
 */
var app = express();

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// pour contrer les erreurs de cross domain
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', '*');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

/**
 * Routes
 */
app.use('/', routes);
app.use('/recog', recog);

module.exports = app;

recog.js

/**
 * Requirements
 */
var express = require('express');
var router = express.Router();
var multer = require('multer');
var uploads = multer({
    dest: 'uploads/',
    rename: function (fieldname, filename) {
        console.log("Rename...");
        return filename + Date.now();
    },
    onFileUploadStart: function () {
        console.log("Upload is starting...");
    },
    onFileUploadComplete: function () {
        console.log("File uploaded");
    }
});

/**
 * Upload d'une image
 */
router.post('/upload', uploads.single('image'), function (req, res, next) {
    console.log("Front-end is calling");
    res.json({status: 'success', data: 'Fichier chargé.\nOrgane sélectionné : ' + req.body.organ});
});

module.exports = router;

Ich habe herumgesucht, aber ich kann nicht herausfinden, was das Problem ist, da ich für Node.js und JavaScript im Allgemeinen noch relativ neu bin.

Danke für Ihre Hilfe, Jungs!

10

Die Verwendung für Multer hat sich geändert.

Derzeit akzeptiert der Multer-Konstruktor nur drei Optionen:

  1. dist/lagerung 
  2. fileFilter
  3. grenzen

jetzt umbenennen, onFileUploadStart, onFileUploadComplete funktioniert nicht.

die Umbenennung kann jedoch mit DiskStorage erfolgen

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

var upload = multer({ storage: storage })

schauen Sie sich diese Links an:

20
Gaurav Gupta

Ich weiß, dass dieser Beitrag veraltet ist. Ich möchte zu denen beitragen, die später ankommen. Nachfolgend finden Sie ein voll funktionsfähiges Serverskript für die Verarbeitung mehrerer hochgeladener Bilder mit zufällig gespeicherten Namen und Dateierweiterung.

var express = require("express");
var multer = require("multer");
var app = express();
var path = require("path");
var uuid = require("uuid");

// Allow cross Origin resource sharing (CORS) within our application
app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploadedimages/')
  },
  filename: function (req, file, cb) {
    cb(null, uuid.v4() + path.extname(file.originalname));
  }
})

var upload = multer({ storage: storage })

// "files" should be the same name as what's coming from the field name on the client side.
app.post("/upload", upload.array("files", 12), function(req, res) {
    res.send(req.files);
    console.log("files = ", req.files);
});

var server = app.listen(3000, function() {
    console.log("Listening on port %s...", server.address().port);
});
6
Thomas Thai

wir geben der Datei mit Hilfe von date einen zufälligen Namen und hängen die ursprüngliche Dateierweiterung mit Hilfe von file.mimetype an.

probieren Sie console.log (file.mimetype) aus. Sie erhalten den Dateinamen und die Erweiterung durch "/" getrennt. Dann spalte ich es in ein Array auf und hole die Erweiterung davon ab.

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

probiere diesen Weg, den ich benutze 

  var storage = multer.diskStorage({
    destination: function (req, file, cb) {
      cb(null, 'uploads/')
    },
    filename: function (req, file, cb) {
      console.log(file);
      var fileObj = {
        "image/png": ".png",
        "image/jpeg": ".jpeg",
        "image/jpg": ".jpg"
      };
      if (fileObj[file.mimetype] == undefined) {
        cb(new Error("file format not valid"));
      } else {
        cb(null, file.fieldname + '-' + Date.now() + fileObj[file.mimetype])
      }
    }
  })

  var upload = multer({ storage: storage })
2
Pradeep Saini

Persönlich habe ich die folgenden Lösungen implementiert, die einen zufälligen Namen für Dateien generieren und die ursprüngliche Dateierweiterung anfügen (ich gehe davon aus, dass meine Erweiterung hinter der letzten liegt.)

var path = require('path');

    var options = multer.diskStorage({ destination : 'uploads/' ,
      filename: function (req, file, cb) {
        cb(null, (Math.random().toString(36)+'00000000000000000').slice(2, 10) + Date.now() + path.extname(file.originalname));
      }
    });

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

    router.post('/cards', upload.fields([{ name: 'file1', maxCount: 1 }, { name: 'file2', maxCount: 1 }]), function(req, res, next) {
    /*
      handle files here
      req.files['file1']; //First File
      req.files['file2']; //Second File
      req.body.fieldNames;//Other Fields in the form

    */
    });


In der MULTER-Dokumentation finden Sie Folgendes: 

Die Festplattenspeicher-Engine gibt Ihnen die vollständige Kontrolle über das Speichern von Dateien in Platte.

Es stehen zwei Optionen zur Verfügung: Ziel und Dateiname . Sie sind Beide Funktionen bestimmen, wo die Datei gespeichert werden soll.

Hinweis: Sie sind für die Erstellung des Verzeichnisses verantwortlich, wenn Sie .__ angeben. Ziel als Funktion. Wenn Sie einen String übergeben, ergibt der Multer Stellen Sie sicher, dass das Verzeichnis für Sie erstellt wurde.

dateiname wird verwendet, um zu bestimmen, wie die Datei in .__ benannt werden soll. Mappe. Wenn kein Dateiname angegeben wird, erhält jede Datei einen zufälligen Namen das enthält keine Dateierweiterung.

Hinweis: Multer fügt für Sie keine Dateierweiterung an, Ihre Funktion sollte einen Dateinamen mit Dateierweiterung zurückgeben.

1
user2517028

Die Datei hat folgende Struktur: 

{
"fieldname": "avatar",
"originalname": "somefile.pdf",
"encoding": "7bit",
"mimetype": "application/pdf",
"destination": "./uploads",
"filename": "36db44e11b83f4513188f649ff445a2f",
"path": "uploads\\36db44e11b83f4513188f649ff445a2f",
"size": 1277191

}

Das nächste Beispiel speichert eine Datei mit dem ursprünglichen Namen und nicht mit dem seltsamen Namen, wie er standardmäßig ist. (Anstelle von "file.originalname" können Sie es wie gewünscht speichern.)

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, './uploads') //Destination folder
  },
  filename: function (req, file, cb) {
    cb(null, file.originalname) //File name after saving
  }
})

var upload = multer({ storage: storage })
0
runha