My Angular 1应用程序将文件保存到S3并允许各种文件类型。
当我检索对象时,我使用以下代码:
export function show(req, res) {
const s3 = new aws.S3();
const s3Params = {
Bucket: S3_BUCKET,
Key: req.query.key + ''
};
res.attachment(req.query.key + '');
var fileStream = s3.getObject(s3Params).createReadStream();
fileStream.pipe(res);
}
我想在新窗口中打开客户端上收到的文件(就像在AWS控制台上一样),但我无法弄清楚如何去做。
例如,客户端根本不起作用:
.then(
(data) => {
var file = new Blob([data], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
}
)
我真的不明白数据流的概念是如何工作的。
答案 0 :(得分:1)
如果您不必下载pdf,可以直接从s3打开它。
s3client.getResourceUrl("your-bucket", "some-path/some-key.jpg");
这会将url返回给该文件。 所以你需要像:
这样的代码
export function show(req, res) {
this.s3client = new aws.S3({
accessKeyId: options.accessKeyId,
secretAccessKey: options.secretAccessKey,
region: options.region
})
let resourceUrl = s3client.getResourceUrl(S3_BUCKET, req.query.key + '');
window.open(resourceUrl, '_blank');
}
对不起,现在无法测试,但试试看。应该工作。
答案 1 :(得分:0)
我所要做的就是获得一个signedUrl资源,使其比我想做的更简单。
export function show(req, res) {
const s3 = new aws.S3();
const s3Params = {
Bucket: S3_BUCKET,
Key: req.query.key + ''
};
s3.getSignedUrl('getObject', s3Params, (err, data) => {
if (err) {
console.log(err);
return res.end();
}
const returnData = {
signedRequest: data,
};
res.write(JSON.stringify(returnData));
res.end();
});
}
在客户端上我所要做的就是在新标签页中打开链接:
openDoc(doc) {
this.$http()
.then(
(data) => {
this.$window.open(data.data.signedRequest, '_blank')
}
)
.catch(
(err) => {
this.Notification.error('failed to download attachment');
}
)
}