Как вернуть файл с помощью Web API?
Я использую ASP.NET Web API.
Я хочу загрузить PDF с C# из API (который генерирует API).
могу ли я просто вернуть API a byte[]
? и для приложения c# я могу просто сделать:
byte[] pdf = client.DownloadData("urlToAPI");?
и
File.WriteAllBytes()?
3 ответа:
лучше вернуть HttpResponseMessage с StreamContent внутри него.
вот пример:
public HttpResponseMessage GetFile(string id) { if (String.IsNullOrEmpty(id)) return Request.CreateResponse(HttpStatusCode.BadRequest); string fileName; string localFilePath; int fileSize; localFilePath = getFileFromID(id, out fileName, out fileSize); HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StreamContent(new FileStream(localFilePath, FileMode.Open, FileAccess.Read)); response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); response.Content.Headers.ContentDisposition.FileName = fileName; response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); return response; }
UPD из комментарий Пэтридж: Если кто-то еще хочет отправить ответ из массива байтов вместо фактического файла, вы захотите использовать новый ByteArrayContent (someData) вместо StreamContent (см. здесь).
Я сделал следующее действие:
[HttpGet] [Route("api/DownloadPdfFile/{id}")] public HttpResponseMessage DownloadPdfFile(long id) { HttpResponseMessage result = null; try { SQL.File file = db.Files.Where(b => b.ID == id).SingleOrDefault(); if (file == null) { result = Request.CreateResponse(HttpStatusCode.Gone); } else { // sendo file to client byte[] bytes = Convert.FromBase64String(file.pdfBase64); result = Request.CreateResponse(HttpStatusCode.OK); result.Content = new ByteArrayContent(bytes); result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = file.name + ".pdf"; } return result; } catch (Exception ex) { return Request.CreateResponse(HttpStatusCode.Gone); } }
пример
IHttpActionResult
наApiController
.[HttpGet] [Route("file/{id}/")] public IHttpActionResult GetFileForCustomer(int id) { if (id == 0) return BadRequest(); var file = GetFile(id); IHttpActionResult response; HttpResponseMessage responseMsg = new HttpResponseMessage(HttpStatusCode.OK); responseMsg.Content = new ByteArrayContent(file.SomeData); responseMsg.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); responseMsg.Content.Headers.ContentDisposition.FileName = file.FileName; responseMsg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); response = ResponseMessage(responseMsg); return response; }
если вы не хотите загружать PDF и использовать браузеры, Встроенные в PDF viewer, вместо этого удалите следующие две строки:
responseMsg.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment"); responseMsg.Content.Headers.ContentDisposition.FileName = file.FileName;