2015-08-24 9 views
10

Próbuję przesłać plik z formularza HTML za pomocą Express.js i Multer. Udało mi się zapisać plik w wybranej lokalizacji (folder o nazwie przesyła).Zmiana nazwy przesłanego pliku za pomocą Multera nie działa (Express.js)

Jednak chciałbym zmienić nazwę pliku podczas przesyłania go ponieważ domyślnie Multer daje dziwne nazwy, takie jak:

5257ee6b035926ca99923297c224a1bb

Może być szesnastkowy datownik ale potrzebuję bardziej jednoznacznej nazwy, aby później wywołać skrypt.

Podążyłem za wyjaśnieniem znalezionym here, ale nie robi nic więcej niż kiedyś: przesyłanie pliku z nazwą hexa.

Również dwa wydarzenia onFileUploadStart i onFileUploadComplete nigdy nie wydają się być wywołane jak nie dostaniesz nic zalogowany mojej konsoli.

używam dwa oddzielne pliki z serwera i 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; 

I ha Zaczęłam się rozglądać, ale nie mam pojęcia, na czym polega problem, ponieważ jestem zupełnie nowy w Node.js i JavaScript w ogóle.

Dzięki za pomoc!

Odpowiedz

17

Użycie dla Multera uległo zmianie.

Obecnie Multer konstruktor przyjmuje tylko trzy opcje:

  1. dist/Przechowywanie
  2. FileFilter
  3. limity

teraz zmienić, onFileUploadStart, onFileUploadComplete nie będzie działać.

jednak zmiany nazwy można zrobić za pomocą 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 }) 

rzucić okiem na te linki:

1

Osobiście wprowadziła następujące rozwiązania, które generuje losową nazwę dla plików i dołącza oryginalne rozszerzenie pliku (zakładam, że moje rozszerzenie jest po ostatnim.)

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 

    */ 
    }); 


W dokumentacji MULTER znajdziesz to: silnik składowania

Dysk daje pełną kontrolę na przechowywanie plików do dysku.

Istnieją dwie opcje, przeznaczenia i filename. Są to obie funkcje, które określają, gdzie plik ma być przechowywany.

Uwaga: Jesteś odpowiedzialny za tworzenie katalogu przy świadczeniu docelowego jako funkcję. Przekazując ciąg, multer sprawi, że będzie pewność, że katalog zostanie utworzony dla ciebie.

nazwa pliku służy do określenia nazwy pliku wewnątrz folderu . Jeśli nie podano nazwy pliku, każdy plik otrzyma losową nazwę , która nie zawiera żadnego rozszerzenia pliku.

Uwaga: Multer nie doda żadnego rozszerzenia pliku dla ciebie, twoja funkcja powinien zwrócić nazwę pliku wraz z rozszerzeniem pliku.

4

Wiem, że ten post jest datowany. Chcę przyczynić się do tych, którzy mogą przyjechać później. Poniżej znajduje się w pełni funkcjonalny skrypt serwera do obsługi wielu przesłanych zdjęć z losowo zapisanymi nazwami zdjęć i rozszerzeniem pliku.

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

dajemy losową nazwę do pliku za pomocą daty i dodaje oryginalnego rozszerzenia pliku przy pomocy file.mimetype

try console.log (file.mimetype) można uzyskać nazwę pliku i rozszerzenie oddzielone przez "/", a następnie podzielę go na tablicę i pobierz z niej rozszerzenie. Wypróbuj poniższy kod.

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

Idealne dziękuję! –

2

spróbować tego sposobu, który używam

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

plik ma strukturę takiego:

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

}

Następny przykład zapisuje plik z jego nazwa oryginalna rozszerzenie, a nie z dziwną nazwą, jak to jest domyślnie. (Zamiast "file.originalname" możesz zapisać go, jak chcesz)

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

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – Clijsters

Powiązane problemy