首页 > 解决方案 > 带有 NestJS 的 Azure 存储 - 使用元数据保存和获取文件

问题描述

我在我的 NestJS 项目中使用 Azure 存储。文件上传工作正常,但我无法成功解决如何使用自定义元上传文件并按名称读取此文件。

如您所见,我originalname用 uuid 覆盖以确保此文件名保持唯一。我接下来将使用此 uuid 作为保存文件的参考。由于覆盖了原始名称,我丢失了有关真实文件名的信息,我想将其存储为元信息。

async uploadFile(file: UploadedFileMetadata): Promise<void> {
    await this.azureStorageService.upload({
      ...file,
      originalname: getUuid(),
    })        
}

azureStorageService没有其他有用的方法,你能告诉我如何将文件名保存到元,然后通过保存的uuid读取这个元来下载这个文件吗?谢谢

标签: typescriptazure-storageazure-blob-storagenestjs

解决方案


你是对的,我已经查看了 的源代码azureStorageService,没有其他有用的方法。但幸运的是,它会用 SAS 令牌回复一个storageUrl,因此我们可以发出另一个 HTTP 请求来调用此REST API来设置 blob 元数据。这是我的测试代码:

  @Post('azure/upload')
  @UseInterceptors(
    AzureStorageFileInterceptor('file', null),
  )
  async UploadedFilesUsingInterceptor(
    @UploadedFile()
    file: UploadedFileMetadata,
    ) {
      file = {
        ...file,
        buffer : Buffer.from('file'),
        originalname: 'somename.txt'
      };
      const storageUrl = await this.azureStorage.upload(file);
      //call rest api to set metadata
      await this.httpService.put(storageUrl + "&comp=metadata",null,{headers:{'x-ms-meta-name':'orginal name here'}})
      .subscribe((response) => {
        console.log(response.status);
      });
   {
    Logger.log(storageUrl);
  }}
}

结果:

在此处输入图像描述


推荐阅读