哪个是通过 nginx 上传图片的更好方法?
Which is the better approach to upload images via nginx?
我想在客户端通过nginx和FileAPI实现文件上传。所以我有以下问题:
- 哪个模块更适合这项任务 nginx-upload-module or native clientbodyinfileonly 还是其他?
- 如何在上传开始之前检查用户是否已通过身份验证(可能触摸后端和 return 一些数据返回到 nginx,例如 user_id)
- 如何将文件重命名为散列,如下所示
www.mysite.com/files/011/b0f/639/011b0f639f69491e9e4cbaf41656297f.jpg
?
- 如何将上传的图片制作并保存三个不同尺寸(128x128、96x96、30x30)的副本?
Which is module better suite for this task nginx-upload-module or
native clientbodyinfileonly or something else?
我刚刚看过 nginx-upload-module
,这是一个 7 岁 的 nginx 模块,用于处理多部分请求。 Nginx 多年来一直支持分段上传,因此只要您不是 运行 7 年前的版本,就无需对 nginx 设置进行任何更改!
对于剩下的问题,我会给你一个例子,使用:
- Thumbnail 生成缩略图(您需要安装 graphitemagick,但您可以用任何其他库替换它)
- 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 !
});
}
});
我想在客户端通过nginx和FileAPI实现文件上传。所以我有以下问题:
- 哪个模块更适合这项任务 nginx-upload-module or native clientbodyinfileonly 还是其他?
- 如何在上传开始之前检查用户是否已通过身份验证(可能触摸后端和 return 一些数据返回到 nginx,例如 user_id)
- 如何将文件重命名为散列,如下所示
www.mysite.com/files/011/b0f/639/011b0f639f69491e9e4cbaf41656297f.jpg
? - 如何将上传的图片制作并保存三个不同尺寸(128x128、96x96、30x30)的副本?
Which is module better suite for this task nginx-upload-module or native clientbodyinfileonly or something else?
我刚刚看过 nginx-upload-module
,这是一个 7 岁 的 nginx 模块,用于处理多部分请求。 Nginx 多年来一直支持分段上传,因此只要您不是 运行 7 年前的版本,就无需对 nginx 设置进行任何更改!
对于剩下的问题,我会给你一个例子,使用:
- Thumbnail 生成缩略图(您需要安装 graphitemagick,但您可以用任何其他库替换它)
- 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 !
});
}
});