使用express.js的jquery-file-upload-middleware:如何移动文件和添加水印?

And*_*sca 5 javascript imagemagick node.js express jquery-file-upload

我设法用express.js 4.0 设置https://github.com/aguidrevitch/jquery-file-upload-middleware,但是配置它有困难.

这是我的上传脚本:

var upload = require('jquery-file-upload-middleware');
upload.configure({
    imageVersions: {
        thumbs: {
            width: 80,
            height: 80
        },
        prev: {
            width: 1280,
            height: 1024
        }
    }
});

app.use('/admin/upload', function (req, res, next) {
    // imageVersions are taken from upload.configure()
    upload.fileHandler({
        uploadDir: function () {
            return __dirname + '/public/uploads/' + req.session.eventID;
        }
    })(req, res, next);

});
Run Code Online (Sandbox Code Playgroud)

上传Chicken.jpg文件我得到以下结构:

/public/uploads/  -> public uploads folder
    534a8d502e889f8d6bf9cc07/  -> upload session folder
        prev/  -> resized version folder
            Chicken.jpg
        thumbs/    -> another resized version folder
            Chicken.jpg
        Chicken.jpg   -> original file
Run Code Online (Sandbox Code Playgroud)

这就是我想要实现的目标:

  1. 将原始文件/public/uploads/534a8d502e889f8d6bf9cc07/Chicken.jpg移出/ public/uploads文件夹,同时保持调整大小的版本.
  2. /public/uploads/534a8d502e889f8d6bf9cc07/prev/Chicken.jpg文件中添加水印.

任何人都可以建议吗?

谢谢!

Lud*_*c C 0

如何移动原始文件:

jquery-file-upload-middleware网站上,它解释了如何移动文件,如果您阅读他们的文档,则说明如何移动具有自定义后缀(用户 ID、会话 ID 等)的文件:

app.use('/api', function (req, res, next) {
            req.filemanager = upload.fileManager();
            next();
        });

        app.use('/api/endpoint', function (req, res, next) {
            // your real /api handler that will actually move the file
            ...
            // req.filemanager.move(filename, path, function (err, result))
            req.filemanager.move('SomeFile.jpg', 'project1', function (err, result) {
                // SomeFile.jpg gets moved from uploadDir/SomeFile.jpg to
                // uploadDir/project1/SomeFile.jpg
                // if path is relative (no leading slash), uploadUrl will
                // be used to generate relevant urls,
                // for absolute paths urls are not generated
                if (!err) {
                    // result structure
                    // {
                    //     filename: 'SomeFile.jpg',
                    //     url: '/uploads/project1/SomeFile.jpg',
Run Code Online (Sandbox Code Playgroud)

如果您不想这样做,(这篇文章)解释了如何使用节点将文件从一个位置移动到另一个位置。我将 unlinkSync() 更改为 unlink()

var fs = require('fs');
//var util = require('util');

var is = fs.createReadStream('source_file');
var os = fs.createWriteStream('destination_file');

is.pipe(os);
is.on('end',function() {
    fs.unlink('source_file', function(err){
         // Continue execution     
    });
});

/* node.js 0.6 and earlier you can use util.pump:
util.pump(is, os, function() {
    fs.unlink('source_file', function(err){
         // Continue execution
    });
});
*/
Run Code Online (Sandbox Code Playgroud)

向文件添加水印

这篇文章解释了如何使用 Node 生成子进程并使用 ImageMagick 向图像添加水印:

    // Require our module dependencies
var exec = require('child_process').exec;

// Create command array to invoke ImageMagick composite where
// -dissolve is the amount of transparency for the watermark
// -gravity tells how to align images of varying size
// -quality is the image quality of the JPEG (not required if producing PNG)
var command = [
    'composite',
    '-dissolve', '50%',
    '-gravity', 'center', 
    '-quality', 100,
    pathToWatermarkJpg,
    pathToImageJpg,
    pathToResultJpg;
];

// Join command array by a space character and then execute command
exec(command.join(' '), function(err, stdout, stderr) {
    // Do stuff with result here
});
Run Code Online (Sandbox Code Playgroud)