【问题标题】:Correct way to display image through restAPI通过rest API显示图像的正确方法
【发布时间】:2014-07-15 12:11:34
【问题描述】:

我目前正在尝试通过 REST API 显示个人资料图片。 我让它工作,但我觉得这不是正确的方法。

所以,在 API 中我得到了一个控制器:

public function getUserprofilepicAction(Request $request) {
    /**
    * Handle stuff
    */

    $file = $user->getWebPath();
    $type = 'image/jpeg';
    header('Content-Type:'.$type);
    header('Content-Length: ' . filesize($file));
    readfile($file);
}

现在 API 调用是这样的:

<somesite>/api/user/userprofilepic.json?userId=84

为了在网页上查看图片:

<img src = <somesite>/app_dev.php/api/user/userprofilepic.json?userId=84>

所以现在我想知道,关于通过 symfony2 中的 restAPI 发送/查看图片的最佳实践究竟是什么。

-干杯

【问题讨论】:

  • 你应该只返回路径而不是文件,所以你返回路径并且 img-tag 读取文件
  • 我尝试返回 webPath,即:“\/UserBundle\/Entity\/..\/..\/..\/..\/profile\/uploads\ /pictures\/623697e0b5da3e25b8e8b83ad40918acc4f8ba73.jpeg" 但是图像不会显示,也许我把它放在 错误?

标签: symfony


【解决方案1】:

您正在控制器中正确执行此操作。

  1. 获取图片
  2. 获取类型(以及长度等其他信息)- 始终为您提供 jpeg?
  3. 设置 HTTP 标头(Content-Type 等)
  4. 返回二进制数据(文件内容)

还有其他方法可以实现:

  • 通过 base64 编码字符串:如果要返回字符串而不是二进制数据,可以将图像编码为 base64 字符串,然后通过网络发送。问题是响应的大小。 base64 编码的字符串比二进制数据大 33%。

  • 通过网络路径:如果你想避免读取图像,每次都发送二进制文件,你可以只返回图像的 URL(例如http://example.com/u/img.jpeg)并让客户端执行请求。这样,您在操作背后就没有任何业务逻辑。每次有人想要头像,他只需要查询图片的URL。对于此解决方案,您需要将图像上传到公共目录中,例如 web/uploads/pics/

PS:如果你想遵循 REST 的想法,我会为路由做类似 &lt;somesite&gt;/api/user/84/profilepicture 的事情。

【讨论】:

  • 很好的答案!跟进问题: - 你知道什么是最常见的,返回二进制数据或 web 路径吗? - 关于 jpeg,不,它并不总是 Jpeg,我只是不知道如何获得 MIME 类型。 - 您能否详细介绍一下 REST 理念?这个 REST 事物的新手。 :) 谢谢你的好回答 :)
  • 我认为最常用的方式是网络路径。您可以使用专用服务器来传送图像、电影、声音等二进制数据。这样可以减少“业务逻辑”服务器的负载。例如,您可以为您的图像使用 CDN,并允许您的用户更快地获取图像——要获得正确的 MIME 类型,您可以使用 Sf 的 UploadedFile 类。 $ufile = new UploadedFile($filePath, $name); $type = $ufile-&gt;getMimeType()。它将尝试从二进制内容中猜测正确的 mime 类型。
  • 简而言之(互联网上有很多关于 REST 的资源),在处理 REST 架构上的资源时,您使用集合和 id 作为 URI。例如,users/1 将引用 ID 为 1 的用户。users/1/friends 将引用用户 1 的朋友列表。users/1/friends/139 将引用用户 1 的朋友 139。users/84/profilepic 可能是一个很好的解决方案获取用户84的属性“profilepic”。或者/profilepictures/84如果要获取id为84的图片(可能与用户84无关)
  • 感谢您的回答,Litz。谢谢你:)
  • @typo:您应该考虑使用Response 类。您可以为每个具有特定标题和内容的操作返回一个 Response 对象。 herehere
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 2021-09-26
相关资源
最近更新 更多