我正在使用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();
});
谢谢!
答案 0 :(得分:2)
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
}
};