S3上传时设置文件名

时间:2016-11-21 11:13:52

标签: node.js amazon-s3

我正在使用aws-sdk module将文件上传到S3。我使用uuid来表示每个文件。

我的问题是 - 如何设置真实文件名(不是uuid),所以当我以后从S3下载密钥时 - 将下载的文件将被命名为真实文件名?

我已经阅读了有关Content-Disposition标头但我认为这只是在下载请求中,我想在上传请求中执行此操作

目前的代码是:

var s3obj = new AWS.S3({
    params: {
        Bucket: CONFIG.S3_BUCKET,
        Key: key,
        ContentType: type
    }
});

s3obj.upload({
    Body: fileData
}).on('httpUploadProgress', function(evt) {
    logger.debug('storing on S3: %s', evt);
}).send(function(err, data) {
    logger.debug('storing on S3: err: %s data: %s', err, data);
    return callback();
});

谢谢!

3 个答案:

答案 0 :(得分:2)

将文件上传到s3(http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property)时确实可以使用

Content-Disposition。然后,您可以在那里添加文件名

s3obj.upload({
    Key: <the uuid>,
    Body: fileData
    ContentDisposition => 'attachment; filename="' + <the filename> + '"',
}).on('httpUploadProgress', function(evt) {
    logger.debug('storing on S3: %s', evt);
}).send(function(err, data) {
    logger.debug('storing on S3: err: %s data: %s', err, data);
    return callback();
});

答案 1 :(得分:1)

Ad Frederic建议,Content-Disposition标题将完成这项工作。但是,我强烈建议使用库来构建此标题(因为在处理支持不同标准和最大问题的不同平台时,它将为您省去很多麻烦 - ENCODING

有很棒的图书馆来实现它 - 叫做content-disposition :)。简单的用法如下:

const contentDisposition = require('content-disposition');
return this.s3.upload({
    ACL: 'private', // Or whatever do you need
    Bucket: someBucket,
    ContentType: mimeType, // It's good practice to set it to a proper mime or to application/octet-stream
    ContentDisposition: contentDisposition(fileName, {
      type: 'inline'
    }),
    Key: someKey,
    Body: someBody
  });
}

答案 2 :(得分:0)

我有类似的要求,无论用户上传的文件名是什么,都需要使用小写文件名上传文件。我尝试了ContentDisposition,但由于某种原因它不起作用,因此我尝试了以下配置,它对我有用。

简而言之,请确保您的密钥反映出您希望文件成为的名称。

const params = {
  Bucket: this.config.bucketName,
  Key: this.config.getFolder() + file.name.toLowerCase(),
  Body: file,
  ContentType: contentType,
  Metadata: {
    "websiteid": "999",
    "userKey": "xyz
  }
};