2016-04-21 100 views
6

我正在製作Web Api,我需要將多個圖像返回給客戶端。我目前使用每個圖像的Base64字符串,但這會導致每個請求花費太長時間。是否有更好,更有效的圖像返回方式?從WebApi返回圖像

這是我使用的代碼:

控制器:

public LearningUnits GetLearningUnits([FromODataUri]Guid key) 
    { 
     var record = db.LearningUnits.SingleOrDefault(inst => inst.LearningUnitId == key); 

     record.ImageURLPath = ImageHandler.ImageToByteArrayFromFilePath(record.ImageURLPath); 

     return record; 
    } 

ImageToByteArray方法:

public static string ImageToByteArrayFromFilePath(string imagefilePath) 
    { 
     byte[] imageArray = File.ReadAllBytes(imagefilePath); 

     string baseImage = Convert.ToBase64String(imageArray); 

     return baseImage; 
    } 
+0

有多少這樣的圖像中總有哪幾種? –

+5

爲什麼你不能在你的模型中返回url,然後客戶端會進一步請求獲取圖片二進制文件? – tenbits

+0

取決於數據庫中的記錄數量。每個記錄都有一個圖像。所以它可能是1到1000. –

回答

0

解決方案是使用媒體格式化程序,以便在使用特定類型查詢Web API時,您將收到特定類型的實際二進制流。

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

這是標準的RESTful圖案;你有相同的URL,但是當你想要一個數據的JSON記錄時,你接受type:application/json,但是當你需要這種媒體類型時,你可以將你的MIME請求類型改爲image/png或類似的東西。

更可以在這裏找到: How to provide custom mediatype formats for OData Api

的OData也含蓄地支持在這裏:https://msdn.microsoft.com/en-us/library/system.web.http.odata.formatter.odatamediatypeformatter(v=vs.118).aspx

+1

返回單個端點的不同數據不是一個好主意。 MediaFormatters只適用於** ** **數據的不同格式。否則,它會違反單一責任原則,不是一種常見的RESTful模式。當然,你可以返回圖像而不是json,但只有當圖像完全代表數據時。 – tenbits

+0

我恭敬地不同意;如果圖像代表所討論的實體,那麼您可以爭辯說它是該特定實體的內容類型。如果數據實體只有一個圖像可視化,那麼即使圖像不是整個實體的完整表示(無論如何可能包括來自OData之類的遙測等),該圖像可視化都是合適的。 如果我們將您的邏輯完整歸結,那麼我們甚至不應該將該對象表示爲application/json或application/xml,因爲它與根本上不同於數據的本機形式。 –

+0

命名'MediaType' **'Formatter' **表示只有格式化程序與實體不同。當然,通過將數據序列化爲特定類型,可能存在更多或更少的信息。考慮到端點'[get]/api/v1/blog/123',當用'accept:image/png'請求端點時,僅僅返回博客文章的主圖像是不夠的,但如果你生成帶有標題的圖像。如果有人想只返回像ImageURLPath這樣的屬性值,那麼應該定義顯式的端點:'[get]/api/v1/blog/123/image'。 – tenbits

1

如果端點返回JSON,那麼有沒有其他辦法,超越base64 ,如何在響應中嵌入二進制文件。但由於性能問題,這絕對是一個壞主意。可能是一些圖標,它會好起來的,但對於較大的圖像不適合。

所以這裏最好的解決方案是將url返回給圖像。客戶端將進一步請求獲取圖像的原始字節。

另外值得一提的是,圖片url不僅可以是靜態文件的路徑,還可以是某個webapi端點的路徑,例如,通過資源id獲取圖片字節並將客戶端原始二進制回來,而不是一個JSON字符串。

+0

我決定走這條路線。我還沒有找到任何更好的選擇,這將是最高效的 –