使用HTTP GET流式传输文件:ASP.NET Core API
使用HTTP GET流式传输文件:ASP.NET Core API
我已经编写了一个控制器,可以将文件下载/流式传输到客户端的本地机器。除了产生响应主体之外,该代码不会在对URL进行GET操作时流式传输文件。
streamcontent方法有什么问题。在调试中,我找不到问题所在。
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using System.Net.Http; using System.Net; using System.IO; using System.Text; namespace FileDownloaderService.Controllers { [Route("api/[controller]")] public class FileDownloadController : Controller { [HttpGet] public HttpResponseMessage Get() { string filename = "ASPNETCore" + ".pdf"; string path = @"C:\Users\INPYADAV\Documents\LearningMaterial\"+ filename; if (System.IO.File.Exists(path)) { HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); var stream = new FileStream(path, FileMode.Open); stream.Position = 0; result.Content = new StreamContent(stream); result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = filename }; result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/pdf"); result.Content.Headers.ContentDisposition.FileName = filename; return result; } else { HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.Gone); return result; } } } }
响应:
{"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1,"minorRevision":-1},"content":{"headers":[{"key":"Content-Disposition","value":["attachment; filename=ASPNETCore.pdf"]},{"key":"Content-Type","value":["application/pdf"]}]},"statusCode":200,"reasonPhrase":"OK","headers":[],"requestMessage":null,"isSuccessStatusCode":true}
在ASP.NET Core中,如果您要发送自定义响应,必须使用IActionResult。所有其他响应将被序列化(默认为JSON)并作为响应主体发送。
在以下答案中可以找到更多信息:File Streaming in ASP.NET Core
问题出现的原因:
在ASP.NET Core中,如果您要发送文件或流式传输文件,但不希望将其序列化为JSON响应,可能会遇到问题。默认情况下,ASP.NET Core将所有响应序列化为JSON,并将其作为响应主体发送。这可能会导致问题,因为您可能希望以原始文件的形式将文件发送到客户端,而不是作为JSON对象。
解决方法:
为了解决这个问题,您可以使用IActionResult接口来发送自定义响应。通过使用IActionResult,您可以将文件或流作为响应的一部分直接发送到客户端,而不需要将其序列化为JSON。
以下是一些示例代码,展示了如何使用IActionResult接口以及如何使用HTTP GET方法来流式传输文件:
[HttpGet] public IActionResult GetFile() { // 获取文件的路径或流 string filePath = "path_to_file"; Stream fileStream = GetFileStream(); // 使用FileResult类将文件流返回给客户端 return new FileStreamResult(fileStream, "application/octet-stream"); }
在上面的示例代码中,我们使用IActionResult接口和HTTP GET方法来获取文件。我们可以根据需要修改代码以获取特定的文件,然后将其作为文件流返回给客户端。通过使用FileStreamResult类,我们可以将文件流作为响应的一部分直接发送给客户端。需要注意的是,我们在这里设置了"application/octet-stream"作为文件的MIME类型,以确保文件以原始格式发送给客户端。
通过使用IActionResult接口和FileStreamResult类,我们可以轻松地在ASP.NET Core应用程序中实现文件的流式传输。这样,我们就可以将文件作为原始文件发送给客户端,而不是作为序列化的JSON对象。这对于需要处理大型文件或需要直接发送文件的应用程序非常有用。