2015-08-24 3 views
10

Я пытаюсь загрузить файл из HTML-формы с помощью Express.js и Multer. Мне удалось сохранить файл в нужном месте (папка с именем загружает).Переименование загруженного файла с помощью Multer не работает (Express.js)

Однако я хотел бы переименовать файл во время его загрузки, потому что, по умолчанию, Multer дает ему странное имя, например:

5257ee6b035926ca99923297c224a1bb

Может быть шестнадцатеричной меткой времени или так, но мне нужно более явное имя, чтобы позже вызвать скрипт.

Я следовал найденному объяснению here, но он не делает ничего больше, чем раньше: загрузка файла с именем hexa.

Кроме того, эти два события onFileUploadStart и onFileUploadComplete никогда не кажутся срабатывать, как я не получаю ничего вошли в моей консоли.

Я использую два отдельных файла для сервера и маршрутизации:

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 ха я копался, но я не могу понять, в чем проблема, поскольку я совершенно новичок в Node.js и JavaScript в целом.

Спасибо за помощь, ребята!

ответ

17

Использование для Multer изменилось.

В настоящее время Multer конструктор принимает только три варианта:

  1. расстояние/хранения
  2. FileFilter
  3. пределы

Теперь переименовывать, onFileUploadStart, onFileUploadComplete не будет работать.

однако переименование может быть сделано с помощью 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 }) 

взглянуть на эти ссылки:

1

Лично я реализовал следующие решения, генерирует случайное имя для файлов и добавляет исходное расширение файла (я предполагаю, что мое расширение после последнего.)

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 

    */ 
    }); 


В MULTER документации вы найдете это:

Диск двигатель хранения дает вам полный контроль над хранением файлов на диске .

Есть две опции, назначения и имя файла. Это обе функции, которые определяют, где должен храниться файл.

Примечание: Вы несете ответственность за создание каталога при предоставлении назначения в качестве функции. При передаче строки multer сделает уверенным, что каталог создан для вас.

имя файла используется для определения того, какой файл должен быть назван в папке . Если имя файла не указано, каждому файлу будет присвоено случайное имя , которое не включает расширение файла.

Примечание: Multer не будет добавлять любое расширение файла для вас, ваша функция должна возвращать имя файла в комплекте с расширением файла.

4

Я знаю, что это сообщение датируется. Я хочу внести вклад в тех, кто может приехать позже. Ниже приведен полный функциональный серверный скрипт для обработки нескольких загруженных изображений со случайными именами сохраненных изображений и расширением файла.

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

мы даем случайное имя в файл с помощью даты и добавляет исходное расширение файла с помощью file.mimetype

попробовать console.log (file.mimetype) вы получите имя и расширение файла разделенный «/», я разбил его на массив и извлек из него расширение. Пробуйте приведенный ниже код.

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

совершенное спасибо! –

2

попробовать этот способ, который я использую

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

файл имеет структуру, как это:

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

}

Следующий пример сохраняет файл с его оригинальным названием а не со странным именем, как по умолчанию. (Вместо имени "file.originalname" вы можете сохранить его, как хотите)

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

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. – Clijsters

Смежные вопросы