首页 > 解决方案 > 通过从流中添加文件来创建 .zip 存档

问题描述

我的任务是通过单击“下载包”按钮来创建和下载 .zip 存档。文件位于 aws.s3 上。从数据库中使用fileId我得到它的路径。然后我调用“downloadBundle”来获取readStreamfileInfo.

public downloadBundle(data: IBundleDownload): Promise<any> {
    return this.hasuraGraphqlApi.getObjectProjectComponent(data.projectComponent.id).then(projectComponent => {
      const fileRemotePaths: Array<string> = projectComponent.files
        .filter(({ type }) => type === data.projectComponent.fileType)
        .map(({ file }) => file.remotePath);

      const params: aws.S3.Types.HeadObjectRequest = {
        Bucket: s3Bucket,
        Key: fileRemotePaths[0],
      };
      return s3.headObject(params).promise()
        .then(data => ({
          fileInfo: data,
          readStream: s3.getObject(params).createReadStream(),
        }))
        .catch(error => {
          throw new StorageError(error);
        });
    });
  }

以下函数返回文件,但我需要修改它以创建一个包含文件的 zip 存档。

public downloadBundle(data: IBundleDownload, res: express.Response): Promise<void> {
    return storageService.downloadBundle(data).then(result => {
      const { readStream, fileInfo }: IDownloadResponse = result;

      return new Promise((resolve, reject) => {
        readStream.on('error', error => {
          reject(new StorageError(error));
        });
        readStream.on('end', () => {
          resolve();
        });
        res.set('Content-Type', fileInfo.ContentType);
        res.set('Content-Length', fileInfo.ContentLength.toString());
        res.set('Last-Modified', fileInfo.LastModified.toString());
        res.set('Content-Disposition', `inline; filename="${fileInfo.Metadata.originalname}"`);
        res.set('Cache-Control', 'public, max-age=31557600');
        res.set('ETag', fileInfo.ETag);
        readStream.pipe(res);
      })
    });
  }

由于我没有实践过实现此类功能,因此我不知道如何在这里使用 node.js 存档器。在此先感谢您的任何建议。

标签: node.jsziparchive

解决方案


推荐阅读