我有一个基于 .NET Core 6.0 的应用程序。我已经编写了从 Azure blob 存储下载文件的代码。它正在下载,但无法在 Acrobat Reader 中以
.pdf
文件形式打开。
我尝试检查内容中的内容并尝试在记事本++中打开它。然后它在 Notepad++ 中显示以下内容。
"FileContents": "JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhlbi1JTikgPj4NCmVuZG9iag0KMiAwIG9iag0KPDwvVHlwZS9QYWdlcy9Db3VudCA1L0tpZHNbIDMgMCBSIDIxIDAgUiAyOCAwIFIgMzAgMCBSIDMyIDAgUl0gPj4NCmVuZG9iag0KMyAwIG9iag0KPDwvVHlwZS9QYWdlL1BhcmVudCAyIDAgUi9SZXNvdXJjZXM8PC9FeHRHU3RhdGU8PC9HUzUgNSAwIFIvR1M4IDggMCBSL0dTMTggMTggMCBSPj4vRm9udDw8L0YxIDYgMCBSL0YyIDkgMCBSL0YzIDExIDAgUi9GNCAxNiAwIFIvRjUgMTkgMCBSPj4vUHJvY1NldFsvUERGL1RleHQvSW1hZ2VCL0ltYWdlQy9JbWFnZUldID4+L01lZGlhQm94WyAwIDAgNjEyIDc5Ml0gL0NvbnRlbnRzIaYqugS9NPMNo7bRaY6pe2hiUMU/valJaN7idEwbONwU5t7EItudNMrJu252ErNZsUd5M2cV7eC0p9CGxxsV7bLhgxgbtxDbYqoGO+pfpNSX21jyUQyJj3DkPlkLuA3g+WTADy1PxLGWBGronGaqim4EoTI3zwvyEy5PkmJtOfdC/cInyYKsA4MTc2DQolJUVPRg==",
"ContentType": "application/octet-stream",
"FileDownloadName": "db575960-5e24-48dd-33c5-08dc24a66af0",
"LastModified": null,
"EntityTag": null,
"EnableRangeProcessing": false
}
这是将文件从 blob 发送回客户端的 API 端点:
public async Task<IActionResult> DownlaodFile([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);
return File(fileDataAsArray, "application/octet-stream", id.ToString());
}
我在 Blazor 代码中阅读它。
var url = "----------------";
var response = await _httpClient.GetByteArrayAsync(url);
if (response is not null)
{
return response;
}
else
return new byte[0];
这是调用 javascript 函数的代码
var fileData = await _fileService.downloadFile(fileId, IsPTW);
if (fileData is not null)
{
await JS.InvokeVoidAsync("fileDownload", filename, "application/pdf", fileData);
}
下面是Javascript代码。
window.fileDownload = (fileName, contentType, fileData) => {
debugger;
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();
无法在我的本地计算机上打开从 Azure Blob 存储下载的文件。
您从 Azure Blob 存储下载的文件是二进制格式,而不是可读格式。要下载 PDF 文件,您需要将内容类型设置为
application/pdf
。您可以尝试在将文件发送回客户端的 API 端点中将内容类型设置为 application/pdf。
代码:
@page "/"
@inject HttpClient _httpClient
@inject IJSRuntime JS
<h3>Filedownload</h3>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount">Increment</button>
<button class="btn btn-success" @onclick="DownloadFile">Download File</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
private async Task DownloadFile()
{
var url = "<Your-blob-url>";
var fileId = Guid.NewGuid();
var response = await _httpClient.GetByteArrayAsync($"{url}?id={fileId}");
if (response != null)
{
await JS.InvokeVoidAsync("fileDownload", $"file_{fileId}.pdf", "application/pdf", response);
}
}
}
样本.js
这是我的 JavaScript:
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();
};
输出:
上面的代码在我的环境中执行,当我单击下载文件时,它会从Azure Blob存储下载PDF文件。
下载后,我从我这边查看,它在Acrobat Reader中打开。
文件: