我正在关注this example
// Load the stream
var fs = require('fs'), zlib = require('zlib');
var body = fs.createReadStream('bigfile').pipe(zlib.createGzip());
// Upload the stream
var s3obj = new AWS.S3({params: {Bucket: 'myBucket', Key: 'myKey'}});
s3obj.upload({Body: body}, function(err, data) {
if (err) console.log("An error occurred", err);
console.log("Uploaded the file at", data.Location);
})
它“有效”,它完全按照预期完成所有操作,除了文件到达S3压缩并保持这种状态。
据我所知,它没有自动设施让它在S3上解压缩,因此,如果您打算上传公开的图像或视频(或者最终用户只想消费的任何其他内容),解决方案似乎让上传的文件解压缩如此......
// Load the stream
var fs = require('fs'), zlib = require('zlib');
var body = fs.createReadStream('bigfile');//.pipe(zlib.createGzip()); <-- removing the zipping part
// Upload the stream
var s3obj = new AWS.S3({params: {Bucket: 'myBucket', Key: 'myKey'}});
s3obj.upload({Body: body}, function(err, data) {
if (err) console.log("An error occurred", err);
console.log("Uploaded the file at", data.Location);
})
我很好奇,如果我做错了什么,并且有一种自动方式让S3识别该文件是否已压缩并解压缩?
答案 0 :(得分:2)
这种方法的工作原理是s3现在已经知道文件是gziped而没有一些帮助。在上传时告诉S3它已经被gzip压缩,你需要在文件上设置元数据。这是正确的事情,这是设置。
您需要在上传时在对象元数据中设置Content-Encoding: gzip
和Content-Type: <<your file type>>
。
稍后编辑:
找到这些解释了如何为Cloudfront做到这一点,但基本相同:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html#CompressedS3
http://www.cameronstokes.com/2011/07/20/compressed-content-amazon-s3-and-cloudfront/
但请注意,根据this blogpost,S3将为gzip文件提供服务,并依赖浏览器解压缩。这在许多情况下都可以正常工作,但由于博客笔记将在curl中失败(因为curl将不知道如何处理gzip文件)。因此,如果您的目的是简单地上传文件供用户进行原始消费,那么您最好的选择是跳过gzipping并将文件上传到未压缩状态。