从 azure 存储中获取文件并通过 Post 方法发送它会抛出错误,但适用于本地文件

Posted

技术标签:

【中文标题】从 azure 存储中获取文件并通过 Post 方法发送它会抛出错误,但适用于本地文件【英文标题】:Getting file from azure storage and sending it via Post method throw error but works with local files 【发布时间】:2021-04-20 01:18:32 【问题描述】:

我已通过 post 方法向服务器发出请求。

文件在本地时有效

这是请求的工作

var options = 
    'method': 'POST',
    'url':'https://api.powerbi.com/v1.0/myorg/groups/xxxxx/imports?datasetDisplayName=test',
    'headers': 
        'Content-Type': 'multipart/form-data',
        'Authorization': `Bearer $tokenResponse.accessToken `
    ,
    formData: 
        '': 
            'value': fs.createReadStream('/Users/userName/Downloads/file.pbix'),
            'options': 
                'filename': 'file.pbix',
                'contentType': null
            
        
    
;
request(options, function (error, response) 
    if (error) throw new Error(error);
    console.log(response.body);
);

现在我将其更改为从 Azure 存储中获取文件

const containerClient = blobServiceClient.getContainerClient('tenants');
const baseUrl = containerClient.url
const blobClient = containerClient.getBlobClient('file/Url/On/AzureBlob')
let blobData
try 
    blobData = await blobClient.download(0)
    console.log(blobData)

 catch (error) 
    console.log(error)


var options = 
    'method': 'POST',
    'url':'https://api.powerbi.com/v1.0/myorg/groups/xxxxx/imports?datasetDisplayName=test',
    'headers': 
        'Content-Type': 'multipart/form-data',
        'Authorization': `Bearer $tokenResponse.accessToken `
    ,
    formData: 
        '': 
            'value': fs.createReadStream('blobData.blobDownloadStream'),
            'options': 
                'filename': 'file.pbix',
                'contentType': null
            
        
    
;
request(options, function (error, response) 
    if (error) throw new Error(error);
    console.log(response.body);
);

这里我从服务器(MS 服务器)收到一条错误消息

'"error":"code":"UnknownError","pbi.error":"code":"UnknownError","parameters":,"details":[],"exceptionCulprit":1'

我猜这个错误来自我下载文件并将其发送到服务器的方式。

有没有办法为 AzureBlobClient 获得与 fs.createReadStream 相同的文件类型/格式?

【问题讨论】:

【参考方案1】:

您应该为fs.createReadStream(some path) 指定文件路径,但在第二种情况下,您提供的字符串不是有效的文件路径。

所以基本上,如果你想在你的代码中使用fs.createReadStream,你应该将文件作为临时文件下载到本地,然后上传。试试下面的代码:

const fileName = "blob Name"
const containerClient = blobServiceClient.getContainerClient('tenants')
const blobClient = containerClient.getBlobClient(fileName)
const tempFilePath = "/some local temp path/" + fileName

blobClient.downloadToFile(tempFilePath).then(function()
    console.log("file downloaded")
    var options = 
        'method': 'POST',
        'url':'https://api.powerbi.com/v1.0/myorg/groups/xxxxx/imports?datasetDisplayName=test',
        'headers': 
            'Content-Type': 'multipart/form-data',
            'Authorization': `Bearer $tokenResponse.accessToken `
        ,
        formData: 
            '': 
                'value': fs.createReadStream(tempFilePath),
                'options': 
                    'filename': 'file.pbix',
                    'contentType': null
                
            
        
    ;
    request(options, function (error, response) 
        if (error) throw new Error(error);
        console.log(response.body);
    );

    //remove temp file after upload
    fs.unlinkSync(tempFilePath)
)

【讨论】:

以上是关于从 azure 存储中获取文件并通过 Post 方法发送它会抛出错误,但适用于本地文件的主要内容,如果未能解决你的问题,请参考以下文章

获取 Azure Blob(图像)并 POST 到外部 API

通过scala获取存储在azure数据湖中的文件名列表

使用 azure 函数从表单数据请求中详细说明并存储在 azure blob 中的多个文件

在从 blob 存储中获取文件并传递给模型进行预测时出现 azure aci webservice 的超时错误

如何从 azure blob 存储中获取 json 数据并使用 azure 数据工厂将其发送到 power apps dataverse

如何使用 c# 从 azure blob 存储中检索 xml 文件