2016-04-21 102 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

我决定走这条路线。我还没有找到任何更好的选择,这将是最高效的 –