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

时间:2015-04-02 20:36:05

标签: node.js file-upload nginx image-uploading

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

  1. 哪个模块更适合此任务nginx-upload-module或原生clientbodyinfileonly 或其他?
  2. 如何在上传开始前检查该用户是否已通过身份验证(可能会触摸后端并将某些数据返回给nginx,如user_id)
  3. 如何将文件重命名为hash,使其看起来像以下www.mysite.com/files/011/b0f/639/011b0f639f69491e9e4cbaf41656297f.jpg
  4. 如何制作并保存上传图像的三个副本(128x128,96x96,30x30)?

1 个答案:

答案 0 :(得分:1)

  

这是nginx-upload-module或此任务的模块更好的套件   本地客户端只是文件或其他东西?

我刚看了nginx-upload-module,这是一个 7岁 nginx模块来处理多部分请求。 Nginx多年来一直支持分段上传,因此只要您没有运行7年版本,就不需要对nginx设置进行任何更改!

对于剩下的问题,我将给你一个例子,使用:

  • Thumbnail生成缩略图(您需要安装graphitemagick,但您可以将其替换为任何其他lib)
  • 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 !
    });
  }
});