You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6.0从Azure Blob下载的PDF无法在本地打开问题

问题分析与解决方案

问题根源

下载的文件内容是包含Base64编码PDF的JSON结构,而非原始二进制PDF数据。这是因为Azure Functions的HttpTrigger中返回ASP.NET Core的IActionResult时,框架会将其序列化为JSON,而非直接输出二进制流,导致客户端拿到的是JSON而非可识别的PDF二进制。

修正步骤

1. 调整API端点代码(Azure Functions)

将返回IActionResult改为直接构建HttpResponseData,输出原始二进制流:

public async Task<HttpResponseData> DownloadFile([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData request)
{
    var query = getquerystring(request.Url.Query);
    var id = Guid.Parse(query["id"]);
    var fileDataAsArray = await _attachmentService.GetFileStream(id);

    var response = request.CreateResponse(HttpStatusCode.OK);
    // 设置正确的PDF内容类型
    response.Headers.Add("Content-Type", "application/pdf");
    // 设置带.pdf后缀的下载文件名
    response.Headers.Add("Content-Disposition", $"attachment; filename=\"{id.ToString()}.pdf\"");
    
    await response.Body.WriteAsync(fileDataAsArray, 0, fileDataAsArray.Length);
    await response.Body.FlushAsync();
    
    return response;
}

2. 客户端代码验证

Blazor中的GetByteArrayAsync可直接获取二进制流,无需修改:

var url = "你的API地址";
var response = await _httpClient.GetByteArrayAsync(url);

return response ?? new byte[0];

3. JavaScript下载函数保持不变

原有JS逻辑可正常处理二进制流:

window.fileDownload = (fileName, contentType, fileData) => {
    var bytes = new Uint8Array(fileData);
    var blob = new Blob([bytes], { type: contentType });

    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
    link.remove();
}

关键注意点

  • 确保API返回的Content-Type为application/pdf,而非application/octet-stream,让浏览器和Acrobat能正确识别文件类型。
  • 下载文件名必须添加.pdf后缀,避免系统无法关联正确的打开程序。
  • Azure Functions中必须使用HttpResponseData而非IActionResult,才能直接输出二进制流,避免被序列化为JSON。

内容的提问来源于stack exchange,提问作者Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:50:36