使用HTTP GET流式传输文件:ASP.NET Core API

25 浏览
0 Comments

使用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}

0
0 Comments

在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对象。这对于需要处理大型文件或需要直接发送文件的应用程序非常有用。

0