2015-08-24 15 views
10

Sto provando a caricare un file da un modulo HTML usando Express.js e Multer. Sono riuscito a salvare il file nella posizione desiderata (una cartella denominata caricamenti).Rinominare un file caricato usando Multer non funziona (Express.js)

Tuttavia, mi piacerebbe rinominare il file durante il caricamento, perché, per impostazione predefinita, Multer dà un nome strano come ad esempio:

5257ee6b035926ca99923297c224a1bb

potrebbe essere una marca temporale esadecimale o così, ma ho bisogno di un nome più esplicito per poter richiamare uno script in seguito.

Ho seguito la spiegazione trovata here ma non fa nulla di più del solito: caricare il file con il nome hexa.

Inoltre, i due eventi onFileUploadStart e onFileUploadComplete non sembrano mai essere attivato come io non vengo nulla collegato mia console.

Sto usando due file separati per il server e il percorso:

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; 

I ah sto scavando intorno ma non riesco a capire quale sia il problema dato che sono abbastanza nuovo per Node.js e JavaScript in generale.

Grazie per il vostro aiuto ragazzi!

risposta

17

L'utilizzo di Multer è cambiato.

Attualmente Multer costruttore accetta solo tre opzioni:

  1. dist/stoccaggio
  2. FileFilter
  3. limiti

ora rinominare, onFileUploadStart, onFileUploadComplete non funzionerebbe.

tuttavia cambiamento titolo può essere fatto utilizzando DiskStorage

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

un'occhiata a questi link:

1

Personalmente ho implementato le seguenti soluzioni che genera un nome casuale per i file e aggiunge l'estensione del file originale (presumo che la mia estensione sia successiva all'ultima.)

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 

    */ 
    }); 


Nella documentazione MULTER troverete questo: motore di memorizzazione

Il disco si dà il pieno controllo sulla memorizzazione di file di disco.

Ci sono due opzioni disponibili, destinazione e il nome del file . Sono entrambe le funzioni che determinano dove deve essere archiviato il file.

Nota: Tu sei responsabile della creazione della directory nel fornire destinazione come una funzione. Quando si passa una stringa, multer renderà sicuro che la directory sia stata creata per te.

nome file viene utilizzato per determinare il nome del file all'interno della cartella . Se non viene specificato alcun nome file, a ogni file verrà assegnato un nome casuale che non include alcuna estensione di file.

Nota: Multer non aggiungerà alcuna estensione di file per te, la tua funzione dovrebbe restituire un nome file completo con un'estensione di file.

4

So che questo post è datato. Voglio contribuire a coloro che possono arrivare più tardi. Di seguito è riportato uno script server completo per gestire più immagini caricate con nomi di immagini e estensione file casuali.

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

diamo un nome casuale di file con l'aiuto di data e aggiunge l'estensione del file originale con l'aiuto di file.mimetype

prova console.log (file.mimetype) si otterrà il nome del file e l'estensione separati da '/' quindi li ho divisi in array e ne ho estratto l'estensione. Prova il codice qui sotto.

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

perfetto grazie! –

2

provare in questo modo che sto usando

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

File ha una struttura come questa:

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

}

L'esempio seguente salva file con il suo nome originale estensione e non con il nome strano come è di default. (Invece di "file.originalname" puoi salvarlo come vuoi)

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

Anche se questo snippet di codice può risolvere la domanda, [compresa una spiegazione] (http://meta.stackexchange.com/questions/114762/explaining-entally-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – Clijsters