Какой лучший способ загрузки изображений через nginx?
Я хочу реализовать загрузку файлов через nginx и FileAPI на стороне клиента. Итак, у меня есть следующие вопросы:
- Какой модуль лучше подходит для этой задачи nginx-upload-module или родной клиентский файл только для файлов или что-то еще?
- Как проверить, что пользователь аутентифицирован перед началом загрузки (возможно, коснитесь бэкэнда и верните некоторые данные обратно в nginx, например, user_id)
- Как переименовать файл в хеш, чтобы он выглядел следующим образом
www.mysite.com/files/011/b0f/639/011b0f639f69491e9e4cbaf41656297f.jpg
? - Как сделать и сохранить три копии загруженного изображения нескольких размеров (128х128, 96х96, 30х30)?
1 ответ
Решение
Какой модуль лучше подходит для этой задачи nginx-upload-module или родной клиентский файл только для файлов или что-то еще?
Я только что посмотрел на nginx-upload-module
и это 7-летний модуль nginx для обработки многочастных запросов. Nginx поддерживает многочастную загрузку уже много лет, поэтому вам не нужно ничего менять в своей настройке nginx, если у вас нет 7-летней версии!
Для оставшихся вопросов я приведу пример, используя:
- Миниатюра для создания миниатюр (Вам понадобится установленный графитовый магии, но вы можете заменить его любой другой библиотекой)
- Q, чтобы легко генерировать разные миниатюры одновременно и иметь чистый код без пирамиды обратного вызова
- Multer для обработки загрузки файлов на стороне сервера.
Вы можете использовать другие библиотеки, чтобы сделать то же самое, но это покажет вам один способ сделать это легко. Ради этого примера это все в одном файле.
var express = require('express');
var multer = require('multer');
var md5 = require('MD5');
var Q = require('q');
var Thumbnail = require('thumbnail');
var app = express();
var targetFolder = '/var/www/mysite/files/full/';
var thumbnailFolder = '/var/www/mysite/files/thumbs/';
var thumbnail = new Thumbnail(targetFolder, thumbnailFolder);
var makeThumbnail = Q.nbind(thumbnail.ensureThumbnail,thumbnail);
var thumbnailSizes = [30,96,128];
app.post('/upload', function(req,res,next) {
//Check the authentication here, this is the first middleware.
if(authenticated) {
next();
} else {
res.send(401);
}
}, multer({
dest: targetFolder,
rename: function (fieldname, filename) {
//Rename the file with it's name + date hash
return md5(filename + Date.now());
},
onFileUploadComplete: function(file, req, res) {
var resizePromises = [];
for(var i in thumbnailSizes) {
var p = makeThumbnail(file.name,thumbnailSizes[i],thumbnailSizes[i]);
resizePromises.push(p);
}
Q.all(resizePromises).done(function(){
// The file has been resized to the specified format.
res.send(200);
},function(err) {
console.log(err);
res.send(500);
// Error !
});
}
});