使用 node sharp 包调整图像大小并上传到 s3 时,它会旋转

Posted

技术标签:

【中文标题】使用 node sharp 包调整图像大小并上传到 s3 时,它会旋转【英文标题】:When using node sharp package to resize image and upload to s3 it is rotated 【发布时间】:2016-06-27 19:38:48 【问题描述】:

我正在使用这个节点包:

https://www.npmjs.com/package/sharp

我使用它来调整图像大小,然后将其上传到亚马逊 S3。

可以找到大多数图像,但其中一些(我假设基于纵横比)会被旋转。

有没有办法防止这种情况或原因?

这是我正在使用的代码的副本。 imageData 是从文件上传的 s3 存储桶文件中获取的数据。 如您所见,我没有调用旋转函数。无论如何要“锁定”旋转?

module.exports.resize = function(imageData, width, fileName)
    sharp(imageData).resize(parseInt(width), null).toBuffer(function (err, data) 
        if (err) throw err;

        s3.putObject(
            Bucket: aws.bucket,
            Key: 'images/' + width + '/' + fileName,
            Body: data
        , function (err, data) 
            if (err) 
                console.log('Failed to resize image due to an error: ' + err);
                return 
                    message: 'Failed to resize image due to an error: ' + err
                ;
             else 
                console.log('s3 image uploaded to ' + 'images/' + width + '/' + fileName);
                return 
                    message: 's3 image uploaded to ' + 'images/' + width + '/' + fileName
                ;
            
        );
    );
);

【问题讨论】:

如果你能显示你的代码和测试图像会更好。 您的图像是否可能包含您的查看器或 libvips(sharp 的支持库)未考虑的 EXIF 方向数据? 如何检查 EXIF 方向数据? 您好,这里是锐利的维护者。 @mikefrey 的评论是最有可能的解释。默认情况下,Sharp 删除 EXIF 元数据。将rotate() 添加到您的处理链中,以便在删除图像之前根据 EXIF 元数据自动旋转图像。 【参考方案1】:

从 url(s3 url) 获取图像的工作代码,调整大小,然后将调整大小的图像上传到 s3

var sharp = require('sharp')
var request = require('request').defaults(encoding: null)
var s3Upload = require('./s3Upload')

module.exports = function (fileLocation) 
  request(fileLocation, function (error, response, body) 
  var fileInstance400x400 = sharp(body)
  var inst400x400 = fileInstance400x400.resize(400, 400)
  s3Upload('filename400x400', inst400X400)
  )

// fileLocation iabsolute url of image

s3上传模块

var aws = require('aws-sdk')
var config = require('../config')
/**
 * @param fileName: filename to be saved
 * @param file: bufferd data
 */

function defaultContentType(req, file, cb) 
  setImmediate(function () 
    var ct = file.contentType || file.mimetype || 'application/octet-stream'
    cb(null, ct);
  );


module.exports = function (fileName, file) 
  aws.config.update(
    accessKeyId: config.S3_CONF.access_key_id,
    secretAccessKey: config.S3_CONF.access_key,
    region: config.S3_CONF.region,
    contentType: defaultContentType,
    limits: fileSize: 1000000, files: config.MAX_FILE_COUNT || 6
  )

  var s3bucket = new aws.S3(params: Bucket: config.S3_CONF.media_bucket);

  var params = Key: fileName, Body: file;
  // TODO setting proper header for s3
  s3bucket.upload(params, function (err, data) 
    if (err) 
      console.log('Error uploading data: ', err);
     else 
      console.log('Successfully uploaded data to myBucket/myKey');
    
  );


希望对你有帮助

【讨论】:

切勿在代码中使用 accessKeyId 和 secretAccessKey ! @EvgenyKolyakov 只要配置引用环境变量并且函数在服务器上而不是在客户端上运行,就可以了。 不,不是!因为明天你可能会扩展你的业务,不小心把它上传到 github 或类似的东西,同时忘记了代码,你就完蛋了。 应该简单地设置机器凭据!

以上是关于使用 node sharp 包调整图像大小并上传到 s3 时,它会旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何在nodejs中使用sharp调整图像大小然后使用multer上传

如何使用 Sharp 从 S3 调整图像大小?

使用 node.js 和 Sharp 包将非裁剪调整为 png

(node.js 模块) 锐利图像处理器保持源文件打开,调整大小后无法取消链接原始文件

在 node.js 中使用Sharp压缩图像

具有清晰上传和调整大小的 Multer-S3