哪个是通过 nginx 上传图片的更好方法?

Which is the better approach to upload images via nginx?

我想在客户端通过nginx和FileAPI实现文件上传。所以我有以下问题:

  1. 哪个模块更适合这项任务 nginx-upload-module or native clientbodyinfileonly 还是其他?
  2. 如何在上传开始之前检查用户是否已通过身份验证(可能触摸后端和 return 一些数据返回到 nginx,例如 user_id)
  3. 如何将文件重命名为散列,如下所示 www.mysite.com/files/011/b0f/639/011b0f639f69491e9e4cbaf41656297f.jpg ?
  4. 如何将上传的图片制作并保存三个不同尺寸(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 !
    });
  }
});