代码之家  ›  专栏  ›  技术社区  ›  Hamza Haddad

管道文件,无需在azure函数中下载

  •  0
  • Hamza Haddad  · 技术社区  · 4 年前

    我想将readstream文件传递给API,而不在本地下载,然后使用 fs 单元

    下面是我的代码示例

    const blobServiceClient = BlobServiceClient.fromConnectionString(
        process.env.CONNEXION_STRING
      );
      const containerClient = blobServiceClient.getContainerClient(
        params.containerName
      );
      const blobClient = containerClient.getBlobClient(process.env.PBIX_LOCATION);
      let blobData;
      try {
        blobData = await blobClient.downloadToFile(`${params.reportName}.pbix`);
        console.log(blobData);
      } catch (error) {
        console.log(error);
      }
      var options = {
        method: "POST",
        url: `https://api.powerbi.com/v1.0/myorg/groups/${params.groupId}/imports?datasetDisplayName=${params.reportName}`,
        headers: {
          "Content-Type": "multipart/form-data",
          Authorization: `Bearer ${params.accessToken} `,
        },
        formData: {
          "": {
            value: fs.createReadStream(`${params.reportName}.pbix`),
            options: {
              filename: `${params.reportName}.pbix`,
              contentType: null,
            },
          },
        },
      };
      //check if file keep in mem
      return new Promise(function (resolve, reject) {
        request(options, function (error, response) {
          if (error) reject(error);
          resolve(response.body);
          fs.unlinkSync(`${params.reportName}.pbix`);
        });
      });
    };
    

    实际上,这段代码在本地运行,但在部署到azure功能时(可能是因为文件下载)。

    我希望在不使用 downloadToFile 作用

    0 回复  |  直到 4 年前
        1
  •  0
  •   Doris Lv    4 年前

    使用 readableStreamBody ,见官方样本:

     // List blobs
      i = 1;
      for await (const blob of containerClient.listBlobsFlat()) {
        console.log(`Blob ${i++}: ${blob.name}`);
      }
    
      // Get blob content from position 0 to the end
      // In Node.js, get downloaded data by accessing downloadBlockBlobResponse.readableStreamBody
      // In browsers, get downloaded data by accessing downloadBlockBlobResponse.blobBody
      const downloadBlockBlobResponse = await blockBlobClient.download(0);
      console.log(
        "Downloaded blob content",
        (await streamToBuffer(downloadBlockBlobResponse.readableStreamBody)).toString()
      );
    

    参考: Azure Storage samples using v12 JavaScript client libraries