• 遇到一个.NET Core WebAPI下载文件到本地中文内容乱码的问题
  • 发布于 2个月前
  • 804 热度
    0 评论
近期做的一个小的修改项目,增加一个从API下载文件保存到本地的功能,文件涉及文本,各种格式的图片,以及PDF等。这个本身没有什么难度,正常的接口Get操作就可以获取到对应的bytes数据,在通过FileStream写入到文件路径,就完成了。逻辑很简单。但实际测试中,却发现文本内容是这样的。这其实是一个测试文本,而乱码的部分是中文备注。

通常获取文字的部分,只要返回response.Content就可以。本来以为乱码是写入本地文件的过程导致的,实际调试发现response.Content本身就是乱码。根据以往的经验,中文乱码,是编码格式导致的。通过Apifox,调用接口Get的结果默认也是乱码,将编码格式换为GBK,就可以得到正确的中文内容。既然这样可以解决问题,那么在返回response.Content之前,我们要先得到response.RawBytes,然后做一下转换,再返回给response.Content,这样得到的中文内容就没有问题。
private string DownLoadTXTFile(string id)
        {

            var client = new RestClient(_url);
            client.Timeout = -1;
            var request = new RestRequest(Method.GET);
            request.AddHeader("accessToken", _Token);
            IRestResponse response = client.Execute(request);
            response.Content = Encoding.Default.GetString(response.RawBytes);
            return response.Content;
        }
我们可以新建一个WebApi,仅文件下载功能,做一个简单的验证。新建一个txt文件,内容如下。

新建一个文档下载的控制器
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace WebApiTxtDemo.Controllers
{
    [ApiController]
    [Route("api/[controller]/[action]")]
    public class DownLoadFileController : ControllerBase
    {

        private readonly ILogger<DownLoadFileController> _logger;

        public DownLoadFileController(ILogger<DownLoadFileController> logger)
        {
            _logger = logger;
        }

        /// <summary>
        /// 堆代码 duidaima.com
        /// Txt文本下载
        /// </summary>
        [HttpGet]
        public FileResult GetTxtFile()
        {
            var filePath = Path.Combine(AppContext.BaseDirectory, "Test.txt");
            FileStream file = new FileStream(filePath, FileMode.Open);
            return File(file, "application/text");
        }
    }
}
启动测试一下:

可以发现读取的中文内容是正常的,下载结果也没问题。

说明很大的问题是出现在前面的测试文件上。
用户评论