使用适用于Node.js的Microsoft Azure存储SDK和适用于浏览器的JavaScript,在浏览器中显示来自天蓝色blob的PDF

时间:2018-08-25 14:21:56

标签: azure-storage azure-functions azure-storage-blobs

我正在尝试使用适用于Node.js的Microsoft Azure存储SDK和适用于浏览器的JavaScript(https://github.com/Azure/azure-storage-node)在浏览器中显示存储在Azure blob中的PDF内容。到目前为止,我找不到任何有关此操作的示例。

我尝试遵循https://github.com/Azure/azure-storage-node/issues/440的建议,但是无法使其生效。我正在使用Azure函数。

module.exports = async function (context, req) {

    let accessToken = await getAccessToken();

    let container = req.params.container;
    let filename = req.params.filename;
    let tokenCredential = new azure.TokenCredential(accessToken);
    let storageAccountName = process.env.StorageAccountName;
    let blobService = azure.createBlobServiceWithTokenCredential(`https://${storageAccountName}.blob.core.windows.net/`, tokenCredential);

    return new Promise((resolve, reject) => {
        let readStream = blobService.createReadStream(container, filename, function (error, result, response) {

                if (error) {
                    context.log(error);
                    context.log(response);
                    context.res = {
                        status: 400,
                        body: response
                    };
                    resolve(context.res);
                } 
        });

        let body = '';
        readStream.on('data', (chunk) => { 
            body += chunk;
        });

        readStream.on('end', () => { 
            context.res = {
                headers: {
                    'Content-Type': "application/pdf"
                },
                body: body
            };
            resolve(context.res);
        });
    });
};

但是我在浏览器中收到“无法打开PDF”错误消息或超时错误。

1 个答案:

答案 0 :(得分:1)

要在浏览器环境中下载blob,建议将URL与SAS一起使用,并且在您使用的框架中,指向PDF的可访问URL是否足够?

请遵循example

  

下载Blob   BlobService提供用于将Blob下载到浏览器内存中的接口。由于浏览器的沙箱限制,我们无法将下载的数据干线保存到磁盘中,直到将Blob的所有数据干线放入浏览器内存中为止。浏览器的内存大小也受到限制,尤其是对于下载巨大的Blob,因此建议直接在具有SAS Token授权链接的浏览器中下载Blob。

共享访问签名(SAS)是提供对blob和容器的精细访问而无需提供存储帐户名或密钥的安全方法。共享访问签名通常用于提供对数据的有限访问,例如允许移动应用访问blob。