API Web ASP .Net scaricare le immagini come binari

Voglio provare a utilizzare Web API per effettuare una chiamata di rest, ma voglio che la risposta sia l’immagine binaria effettiva memorizzata in un database, non una stringa codificata in base64 JSON. Qualcuno ha avuto alcuni suggerimenti su questo?

Aggiornamento- Questo è quello che ho finito per implementare:

HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); result.Content = new StreamContent(new MemoryStream(profile.Avatar)); result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); result.Content.Headers.ContentDisposition.FileName = "avatar.png"; return result; 

È ansible impostare il contenuto della risposta su un object StreamContent:

  var fileStream = new FileStream(path, FileMode.Open); var resp = new HttpResponseMessage() { Content = new StreamContent(fileStream) }; // Find the MIME type string mimeType = _extensions[Path.GetExtension(path)]; resp.Content.Headers.ContentType = new MediaTypeHeaderValue(mimeType); 

Mentre questo è stato contrassegnato come risposta, non era esattamente quello che volevo, quindi ho continuato a cercare. Ora che l’ho capito, ecco cosa ho:

 public FileContentResult GetFile(string id) { byte[] fileContents; using (MemoryStream memoryStream = new MemoryStream()) { using (Bitmap image = new Bitmap(WebRequest.Create(myURL).GetResponse().GetResponseStream())) image.Save(memoryStream, ImageFormat.Jpeg); fileContents = memoryStream.ToArray(); } return new FileContentResult(fileContents, "image/jpg"); } 

Certo, è per ottenere un’immagine attraverso un URL. Se vuoi semplicemente catturare un’immagine dal file server, immagino che tu sostituisca questa linea:

 using (Bitmap image = new Bitmap(WebRequest.Create(myURL).GetResponse().GetResponseStream())) 

Con questo:

 using (Bitmap image = new Bitmap(myFilePath)) 

EDIT: Non importa, questo è per MVC regolare. per le API Web, ho questo:

 public HttpResponseMessage Get(string id) { string fileName = string.Format("{0}.jpg", id); if (!FileProvider.Exists(fileName)) throw new HttpResponseException(HttpStatusCode.NotFound); FileStream fileStream = FileProvider.Open(fileName); HttpResponseMessage response = new HttpResponseMessage { Content = new StreamContent(fileStream) }; response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg"); response.Content.Headers.ContentLength = FileProvider.GetLength(fileName); return response; } 

Che è abbastanza simile a quello che ha OP.

Ho fatto esattamente questa cosa. Ecco il mio codice:

 if (!String.IsNullOrWhiteSpace(imageName)) { var savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.Combine(uploadPath, imageName)); var image = System.Drawing.Image.FromFile(savedFileName); if (ImageFormat.Jpeg.Equals(image.RawFormat)) { // JPEG using(var memoryStream = new MemoryStream()) { image.Save(memoryStream, ImageFormat.Jpeg); var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(memoryStream.ToArray()) }; result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); result.Content.Headers.ContentLength = memoryStream.Length; return result; } } else if (ImageFormat.Png.Equals(image.RawFormat)) { // PNG using (var memoryStream = new MemoryStream()) { image.Save(memoryStream, ImageFormat.Png); var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(memoryStream.ToArray()) }; result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/png"); result.Content.Headers.ContentLength = memoryStream.Length; return result; } } else if (ImageFormat.Gif.Equals(image.RawFormat)) { // GIF using (var memoryStream = new MemoryStream()) { image.Save(memoryStream, ImageFormat.Gif); var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(memoryStream.ToArray()) }; result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/gif"); result.Content.Headers.ContentLength = memoryStream.Length; return result; } } } 

E poi sul client:

  var client = new HttpClient(); var imageName = product.ImageUrl.Replace("~/Uploads/", ""); var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Properties.Settings.Default.DeviceMediaPath + "\\" + imageName); var response = client.GetAsync(apiUrl + "/Image?apiLoginId=" + apiLoginId + "&authorizationToken=" + authToken + "&imageName=" + product.ImageUrl.Replace("~/Uploads/","")).Result; if (response.IsSuccessStatusCode) { var data = response.Content.ReadAsByteArrayAsync().Result; using (var ms = new MemoryStream(data)) { using (var fs = File.Create(path)) { ms.CopyTo(fs); } } result = true; } else { result = false; break; } 

Questo compito è facilmente raggiungibile senza utilizzare WebAPI. Implementerei un gestore HTTP personalizzato per un’estensione univoca e restituire lì la risposta binaria. Il vantaggio è che è anche ansible modificare le intestazioni di HTTP Response e il tipo di contenuto, in modo da avere il controllo assoluto su ciò che viene restituito.

Puoi ideare un pattern URL (definendo come sai quale immagine restituire in base al relativo URL) e mantenere tali URL nelle risorse API. Una volta che l’URL viene restituito nella risposta API, può essere richiesto direttamente dal browser e raggiungerà il gestore HTTP, restituendo l’immagine corretta.

Le immagini sono di contenuto statico e hanno il loro ruolo in HTTP e HTML: non è necessario combinarle con il JSON utilizzato quando si lavora con un’API.