近期做的一个小的修改项目,增加一个从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");
}
}
}
启动测试一下:
可以发现读取的中文内容是正常的,下载结果也没问题。
说明很大的问题是出现在前面的测试文件上。