javascript - 使用 s3 getobjectcommand 结果以 Angular (以 pdf 形式打开)

标签 javascript node.js angular aws-sdk-nodejs aws-s3-client

我正在尝试使用 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/

相关文章:

javascript - 阻止 nunjucks 转义 HTML

node.js - 我如何检查请求是否通过 https 快速发送

node.js - 为什么我的异步等待不等待我的 web3.js sendRawTransaction?

angular - 等待可观察对象时何时关闭离​​子加载 Controller

angular - NativeScript + Angular - 预览中的新项目错误 : Type AppRoutingModule does not have 'ngModuleDef' property

javascript - NodeJs的 "Child Process"如何与事件循环交互?

javascript - 另一个标签内的innerHTML

javascript - 更改状态中数组的特定索引而不是我的所有状态对象

javascript - 使用 Nodejs 的实时通知 Web 应用程序

javascript - 从 angular2 构建的新 Cordova 在 android 上构建白屏