首页 > 解决方案 > 尝试下载容器文件时出现“{“message”:“标题 \"Content-Type\""} 的无效值 \"undefined\" 错误

问题描述

我使用下面的代码从 azure 容器中获取文件。

const azure = require('azure-storage');
const url = `https://${storageAccountName}.blob.core.windows.net}`;
const blobSvc = azure.createBlobService(storageAccountName, accessKey, url);

const read = blobSvc.createReadStream(containerName, fileName);

res.setHeader('Content-Disposition', `attachment; filename=${filename}`);
res.setHeader('Content-Type', read.contentType);
readable.stream.pipe(res);

但是,当我下载文本文件时,我进入{"message":"Invalid value \"undefined\" for header \"Content-Type\""}了文件。

const azure = require('azure-storage');
const url = `https://${storageAccountName}.blob.core.windows.net}`;
const blobSvc = azure.createBlobService(storageAccountName, accessKey, url);

const properties = blobSvc.getBlobProperties(
containerName,
fileName,
function(err, properties, status) {
    if (err) {
        res.send(502, "Error fetching file: %s", err.message);
    } else if (!status.isSuccessful) {
        res.send(404, "The file %s does not exist", fileName);
    } else {
        return properties;
    }
});

)

返回属性;

在这个函数中,对于第一次调用,它返回 null,在第二次调用期间会弹出值,但它是无用的,因为在这种情况下 await 不起作用并且线程以未定义的值结束。有什么我错过了吗?

标签: node.jstypescriptazureazure-storageazure-stream-analytics

解决方案


您收到此错误的原因是因为向blobSvc.createReadStream您返回了一个没有contentType属性的流。

如果您需要在响应标头中发送内容类型,您首先需要获取 blob 的属性并contentType从那里使用该属性。

这是一个示例代码(未经测试)(参考:https ://willi.am/blog/2014/07/03/azure-blob-storage-and-node-downloading-blobs/ ):

blobSvc.getBlobProperties(
    containerName,
    fileName,
    function(err, properties, status) {
        if (err) {
            res.send(502, "Error fetching file: %s", err.message);
        } else if (!status.isSuccessful) {
            res.send(404, "The file %s does not exist", fileName);
        } else {
            res.setHeader('Content-Disposition', `attachment; filename=${filename}`);
            res.setHeader(Content-Type', properties.contentType);
            blobService.createReadStream(containerName, fileName).pipe(res);
        }
    });
)

推荐阅读