使用 Azure Function (.NET Core) 下载文件
Using Azure Function (.NET Core) to Download a file
我已经使用 .NET Core 创建了 HTTP 触发的 Azure 函数 (v2),希望我可以在请求正文中传递一些信息的同时执行该函数,然后让函数 return/download 成为一个文件在浏览器中。不幸的是,我正在努力让它工作。
下面是一段代码
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
{
string csv;
//Do some stuff to create a csv
byte[] filebytes = Encoding.UTF8.GetBytes(csv);
req.HttpContext.Response.Headers.Add("content-disposition", "attachment;filename=Export.csv");
req.HttpContext.Response.ContentType = "application/octet-stream";
return (ActionResult)new OkObjectResult(filebytes);
}
当我使用 Postman 执行 post 时,请求被接受但响应为 406 "unacceptable" 并且日志中的输出状态为
"Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector[1]
找不到用于写入响应的内容类型 'application/octet-stream' 的输出格式化程序。"
我已经尝试了多种内容类型,包括 text/plain 和 text/csv,所有内容类型都对输出格式给出了相同的响应。
如果我删除或注释掉请求处理的 ContentType 和 returns 200,但文件字节将在响应正文中返回,而不是在浏览器中下载。
为此您需要一个 FileContentResult:
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
{
string csv;
//Do some stuff to create a csv
byte[] filebytes = Encoding.UTF8.GetBytes(csv);
return new FileContentResult(filebytes, "application/octet-stream") {
FileDownloadName = "Export.csv"
};
}
虽然评论正确指出理想的解决方案是在 HTTP 函数中异步启动处理,return 202 已接受响应,将结果保存到 blob 存储,让客户端等待处理以在开始下载 blob 之前完成,然后在下载 blob 后将其删除,当前的 Azure Functions 定价仅为 0.000016 美元/GB-s,因此您可能会发现这太复杂了,除非您的流量非常高。
我已经使用 .NET Core 创建了 HTTP 触发的 Azure 函数 (v2),希望我可以在请求正文中传递一些信息的同时执行该函数,然后让函数 return/download 成为一个文件在浏览器中。不幸的是,我正在努力让它工作。
下面是一段代码
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
{
string csv;
//Do some stuff to create a csv
byte[] filebytes = Encoding.UTF8.GetBytes(csv);
req.HttpContext.Response.Headers.Add("content-disposition", "attachment;filename=Export.csv");
req.HttpContext.Response.ContentType = "application/octet-stream";
return (ActionResult)new OkObjectResult(filebytes);
}
当我使用 Postman 执行 post 时,请求被接受但响应为 406 "unacceptable" 并且日志中的输出状态为
"Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector[1] 找不到用于写入响应的内容类型 'application/octet-stream' 的输出格式化程序。"
我已经尝试了多种内容类型,包括 text/plain 和 text/csv,所有内容类型都对输出格式给出了相同的响应。
如果我删除或注释掉请求处理的 ContentType 和 returns 200,但文件字节将在响应正文中返回,而不是在浏览器中下载。
为此您需要一个 FileContentResult:
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
{
string csv;
//Do some stuff to create a csv
byte[] filebytes = Encoding.UTF8.GetBytes(csv);
return new FileContentResult(filebytes, "application/octet-stream") {
FileDownloadName = "Export.csv"
};
}
虽然评论正确指出理想的解决方案是在 HTTP 函数中异步启动处理,return 202 已接受响应,将结果保存到 blob 存储,让客户端等待处理以在开始下载 blob 之前完成,然后在下载 blob 后将其删除,当前的 Azure Functions 定价仅为 0.000016 美元/GB-s,因此您可能会发现这太复杂了,除非您的流量非常高。