ASP.Net Core Web API 如何返回 File。

咨询区

  • Jan Kruse

我想在 ASP.Net Web API 中返回 File 文件,我目前的做法是将 Action 返回值设为 HttpResponseMessage,参考代码如下:


public async Task<HttpResponseMessage> DownloadAsync(string id)
{
    var response = new HttpResponseMessage(HttpStatusCode.OK);
    response.Content = new StreamContent({{__insert_stream_here__}});
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    return response;
}

当我在浏览器测试时,我发现Api将 HttpResponseMessage 作为 json格式返回,同时 Http Header 头为 application/json,请问我该如何正确配置成文件流返回。

回答区

  • H. Naeemaei

我觉得大概有两种做法:

  1. 返回 FileStreamResult


    [HttpGet("get-file-stream/{id}"]
    public async Task<FileStreamResult> DownloadAsync(string id)
    {
        var fileName="myfileName.txt";
        var mimeType="application/...."; 
        Stream stream = await GetFileStreamById(id);

        return new FileStreamResult(stream, mimeType)
        {
            FileDownloadName = fileName
        };
    }

  1. 返回 FileContentResult


    [HttpGet("get-file-content/{id}"]
    public async Task<FileContentResult> DownloadAsync(string id)
    {
        var fileName="myfileName.txt";
        var mimeType="application/...."; 
        byte[] fileBytes = await GetFileBytesById(id);

        return new FileContentResult(fileBytes, mimeType)
        {
            FileDownloadName = fileName
        };
    }

  • Nkosi

这是因为你的代码将 HttpResponseMessage 视为一个 Model,如果你的代码是 Asp.NET Core 的话,其实你可以混入一些其他特性,比如将你的 Action 返回值设置为一个派生自 IActionResult 下的某一个子类,参考如下代码:


[Route("api/[controller]")]
public class DownloadController : Controller {
    //GET api/download/12345abc
    [HttpGet("{id}")]
    public async Task<IActionResult> Download(string id) {
        Stream stream = await {{__get_stream_based_on_id_here__}}

        if(stream == null)
            return NotFound(); // returns a NotFoundResult with Status404NotFound response.

        return File(stream, "application/octet-stream"); // returns a FileStreamResult
    }    
}

点评区

记得我在 webapi 中实现类似功能时,我用的就是后面这位大佬提供的方式, ActionResult + File 的方式,简单粗暴。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: dropzone.js 是一个非常流行的文件上传库,可以方便地在网页中实现文件拖拽上传的功能。而 ASP.NET Core WebAPI 是一个用于构建 Web API 的框架,可以快速地开发和部署具有高性能和可伸缩性的 Web API。 要在 ASP.NET Core WebAPI 中集成 dropzone.js,首先需要在前端代码中引入 dropzone.js 相关的脚本和样式文件。然后,在页面中创建一个用于接收文件上传的表单,并将其配置为使用 dropzone.js 进行文件上传。可以通过配置一些参数来自定义上传行为,例如设置文件上传的最大数量、文件大小限制、文件类型限制等。 在后端代码中,需要创建一个用于处理文件上传的 API 接口,该接口会接收前端发起的文件上传请求,并将上传的文件保存到指定的位置。可以使用 ASP.NET Core WebAPI 提供的 HttpRequest 对象来处理文件上传,通过读取请求的文件流来获取上传的文件内容,并将文件保存到指定的文件夹中。 在接收到文件上传请求后,需要进行一些验证和处理操作。例如,可以检查文件大小和类型是否符合要求,并根据需求进行相应的文件处理,例如修改文件名称、生成缩略图、写入数据库等。处理完成后,可以通过 API 接口返回相应的结果,例如返回上传成功的消息或返回上传失败的原因。 总结来说,使用 dropzone.jsASP.NET Core WebAPI 可以很方便地实现文件上传功能。前端使用 dropzone.js 实现文件拖拽上传,后端使用 ASP.NET Core WebAPI 接受并处理上传的文件。通过结合使用这两个工具,可以轻松地实现一个功能强大且易于维护的文件上传功能。 ### 回答2: dropzone.js是一个基于JavaScript的文件上传库,它可以与asp.net core webapi配合使用来进行文件上传的处理。在使用dropzone.js时,我们需要引入相关的JavaScript和CSS文件,并建立一个HTML表单元素作为文件上传的区域。 在asp.net core webapi中,我们可以编写一个控制器来处理文件上传的请求。首先,我们需要在控制器中添加一个HttpPost方法,用于接收从前端传递过来的文件数据。然后,我们可以使用IFormFile接口来接收和处理上传的文件。 具体的实现步骤如下: 1. 在前端的HTML中,我们需要引入dropzone.js的相关文件,并在表单中定义一个用于文件上传的区域。可以设置一些参数来自定义文件上传的行为。 2. 在asp.net core webapi的控制器中,添加一个HttpPost方法,并使用[FromForm]特性将上传的文件绑定到IFormFile类型的参数中。 3. 在HttpPost方法中,可以对上传的文件进行处理,比如保存到服务器指定的路径中、返回文件的信息等。 主要的代码示例如下: 前端HTML代码: ```html <form action="/api/upload" class="dropzone" id="my-dropzone"></form> ``` 前端JavaScript代码: ```javascript Dropzone.options.myDropzone = { url: "/api/upload", maxFiles: 10, maxFilesize: 5, acceptedFiles: ".pdf,.jpg,.png", init: function () { this.on("success", function (file, response) { console.log("File uploaded:", file); }); }, }; ``` 后端C#代码: ```csharp [ApiController] [Route("api/[controller]")] public class UploadController : ControllerBase { [HttpPost] public async Task<IActionResult> UploadFile([FromForm] IFormFile file) { // 对上传的文件进行处理,比如保存到指定路径中 if (file != null && file.Length > 0) { var filePath = Path.Combine("path/to/save", file.FileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } } return Ok(new { message = "File uploaded successfully." }); } } ``` 通过以上代码,我们可以在前端页面中使用dropzone.js来实现文件的上传,并在后端的asp.net core webapi中编写相应的控制器来处理上传的文件。这样就可以实现一个基于dropzone.jsasp.net core webapi的文件上传功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值