我正在尝试使用 Angular 作为 pdf 从 s3 存储桶中打开文件。为此,我运行一个 Node 服务来获取我从 Angular 调用的对象。然后我尝试以 pdf 形式打开 Angular 。我有什么遗漏的吗?当我打开 PDF 时,它显示为空白(白色)文档。
下面是我的 Node 代码:
const streamToString = (stream) =>
new Promise((resolve, reject) => {
const chunks = [];
stream.on("data", (chunk) => chunks.push(chunk));
stream.on("error", reject);
stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
});
const readFile = async function getObj(key) {
const params = {
Bucket: vBucket,
Key: key,
};
const command = new GetObjectCommand(params);
const response = await client.send(command);
const { Body } = response;
return streamToString(Body);
};
在这里,我正在使用 Angular 并以 PDF 形式打开
服务:
getObj(key: String): Observable<any>{
const httpOptions = {
'responseType' : 'arraybuffer' as 'json'
//'responseType' : 'blob' as 'json' //This also worked
};
return this.http.get<any>(environment.s3Ep + '/getfile?key=' + key, httpOptions );
}
以及使用该服务的代码:
this.s3Svc.getObj(key).subscribe(
res => {
let file = new Blob([res], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
}
);
最佳答案
我开始遇到同样的问题。找到了解决方案,将streamToString替换为streamToBuffer,如下:
const streamToBuffer = async (stream: Readable): Promise<Buffer> => {
return new Promise((resolve, reject) => {
const chunks: Array<any> = []
stream.on('data', (chunk) => chunks.push(chunk))
stream.on('error', reject)
stream.on('end', () => resolve(Buffer.concat(chunks)))
})
}
以及使用它的代码:
const command = new GetObjectCommand({ Bucket, Key })
const data = await s3.send(command)
const content = await streamToBuffer(data.Body as Readable)
fs.writeFileSync(destPath, content)
就我而言,我正在写入 PDF 文件。 写入从streamToString检索的字符串或写入buffer.toString()会导致空白PDF。
关于javascript - 使用 s3 getobjectcommand 结果以 Angular (以 pdf 形式打开),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73941811/