S3解压缩上传的文件失败



我遵循这个例子

// 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识别文件到达压缩和解压缩它?

这样做的方式是s3现在有办法知道文件被压缩了,而不需要任何帮助。您需要在上传时设置文件上的元数据,告诉S3它已被压缩。它会做正确的事情,这是设置。

上传时需要设置对象元数据中的Content-Encoding: gzipContent-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/

但是请注意,根据这篇博文S3将提供压缩文件,并依赖于浏览器来解压缩它。这在很多情况下工作得很好,但正如博主指出的那样,在curl中会失败(因为curl不知道如何处理压缩后的文件)。因此,如果您的目的只是上传一个文件供用户使用,那么最好的方法是跳过gzip并以未压缩状态上传文件。

最新更新