2015-04-02 71 views
-4

我想在客戶端通過nginx和FileAPI實現文件上傳。所以,我有以下問題:哪個更好的方法通過nginx上傳圖片?

  1. 哪個模塊更好套件這個任務nginx-upload-module或天然clientbodyinfileonly或其他什麼東西?
  2. 如何檢查用戶上傳開始(也許觸摸後端,並返回一些數據回nginx的像USER_ID)
  3. 如何重命名文件哈希是類似於以下www.mysite.com/files/011/b0f/639/011b0f639f69491e9e4cbaf41656297f.jpg之前被驗證?
  4. 如何製作和保存上傳圖像的三個副本幾種尺寸(128x128,96x96,30x30)?

回答

1

哪個模塊更好套件這個任務nginx的上傳模塊或 本地clientbodyinfileonly或其他什麼東西?

我只是看看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 ! 
    }); 
    } 
}); 
+0

感謝您的回答'nginx-upload-module'並不像您想象的那麼古老。最後一次提交是在2014年12月5日https://github.com/vkholodkov/nginx-upload-module/tree/2.2。也許我會很快嘗試你的方法,但我有興趣通過nginx上傳。不幸的是'clientbodyinfileonly'不支持'multypart/formdata.'謝謝你的答案 – Erik 2015-04-12 07:37:36