У меня есть веб-API ASP.NET Core с некоторыми методы для GetAllFiles, Upload и Download файлов.
В контроллере моего API есть один метод для загрузки файла (код показан здесь):
Код: Выделить всё
[HttpGet("{id}")]
public async Task DownloadFile(Guid id)
{
var fileInDb = pdfRepository.GetByIdAsync(x => x.Pdf_Pk == id, false);
if (fileInDb == null)
{
return NotFound();
}
// var fileName = _data.PdfDetail.Where(x => x.Pdf_Pk == id).Select(x => x.FileName).FirstOrDefault();
var filePath = Path.Combine(Directory.GetCurrentDirectory(), "root\\Files", fileInDb.Result.FileName);
var provider = new FileExtensionContentTypeProvider();
if (!provider.TryGetContentType(filePath, out var contentType))
{
contentType = "application/octet-stream";
}
var bytes = await System.IO.File.ReadAllBytesAsync(filePath);
return File(bytes, contentType, Path.GetFileName(filePath));
}
Я вызываю этот метод из контроллера моего веб-приложения.
Код для загрузки:
Код: Выделить всё
public async Task Download(Guid Id)
{
return RedirectToAction("Index" ,await PdfServices.DownloadAsync(Id));
}
Код: Выделить всё
public Task DownloadAsync(Guid Id)
{
return SendAsync(new ApiRequest()
{
type = APIRequestHeader.APIRequest.ApiType.Get,
Data = Id,
Url = ApiUrl + "/api/PdfManager/"+Id
});
}
Код: Выделить всё
public async Task SendAsync(ApiRequest request)
{
try
{
var client = httpClientFactory.CreateClient("PdfManager");
HttpRequestMessage message = new();
message.Headers.Add("Accept", "Applicaiton/Json");
message.RequestUri = new Uri(request.Url);
if (request.Data != null)
{
message.Content = new StringContent(JsonConvert.SerializeObject(request.Data), Encoding.UTF8, "Application/Json");
}
switch(request.type)
{
case APIRequest.ApiType.Post:
message.Method = HttpMethod.Post;
break;
case APIRequest.ApiType.Put:
message.Method = HttpMethod.Put;
break;
case APIRequest.ApiType.Delete:
message.Method = HttpMethod.Delete;
break;
default:
message.Method = HttpMethod.Get;
break;
}
HttpResponseMessage hrm = null;
hrm = await client.SendAsync(message);
var apiContent = await hrm.Content.ReadAsStringAsync();
if (true) // don't know what to write in this, to download this file
{
var readByte = hrm.Content.ReadAsByteArrayAsync();
using(MemoryStream ms =new MemoryStream(readByte.Result))
{
var writer = new BinaryWriter(ms, Encoding.UTF8, false);
var res = new FileContentResult(readByte.Result, hrm.Content.Headers.ContentType.MediaType);
//return (T)res;
var test = JsonConvert.DeserializeObject(res);
}
}
var apiResponse = JsonConvert.DeserializeObject(apiContent);
return apiResponse;
}
catch (Exception ex)
{
var dto = new ApiResponse
{
ErrorMessage = new List { Convert.ToString(ex.ToString())},
IsSuccess = false
};
var res = JsonConvert.SerializeObject(dto);
var ApiResponse = JsonConvert.DeserializeObject(res);
return ApiResponse;
}
}
Поскольку мы возвращаем файл из контроллера API, как я могу загрузить этот файл?
Я не могу прочитать содержимое в виде строки:
Код: Выделить всё
hrm.Content.ReadAsStringAsync();
Если я читаю его как ByteArray, то я не способен десериализовать объект, потому что он запросит тип.
Как я могу загрузить этот файл, поступающий в контент из контроллера API? Как мне это прочитать, что вернуть?
Подробнее здесь: https://stackoverflow.com/questions/784 ... om-web-api