.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
相关产品推荐
相关产品推荐

