我应该如何从用 PHP 编写的 RESTful api 提供二进制文件(图像/音频)?

Posted

技术标签:

【中文标题】我应该如何从用 PHP 编写的 RESTful api 提供二进制文件(图像/音频)?【英文标题】:How should I be serving binary files (images / audio) from a RESTful api written in PHP? 【发布时间】:2014-09-17 09:43:56 【问题描述】:

我正在计划一个 RESTful API,我想知道通过 api 提供文件/文件包的最佳方式。

我可能遗漏了一些东西,但在我看来,我的选择是:

    Base64_encode 文件并在 JSON 响应中提供服务 在 JSON 响应中提供指向文件的链接。

我还需要记住,其中一些文件需要私有,并且只有在成功验证后才能提供。

我还简要地查看了mod_xsendfile 的实现,想知道这是否是我应该考虑的路线。

【问题讨论】:

api 的另一端是什么?对于移动/网络等,您可能需要不同的方法。如果它是一个开放的 api .. 可以同时提供。 这个想法是任何东西都可以放在 API 的末尾,尽管最初它是针对 iosandroid 应用程序的。 【参考方案1】:

Facebook、Flickr 和 Instagram 等世界上最常用的 API 提供图片的静态链接。

如果您提供以 base64 编码的二进制文件,它们会更重,并且在服务器端和客户端都需要更多的 CPU 资源来对它们进行编码/解码。

捆绑文件有好处的唯一情况是,如果您想发送许多非常小的文件,例如图标。

【讨论】:

正是我需要知道的。谢谢。【参考方案2】:

一般来说,使用基于 ASCII 的协议来传输二进制文件是一个(非常)糟糕的主意,尤其是当它们很重时。您可以公开一个 URI,消费者将能够在不使用 REST API 的情况下下载文件,并使用单独的 php 脚本(或任何其他类型的语言)使用会话执行访问控制部分,并使用必需的 HTTP 标头。最后一部分非常简单。

http://fr2.php.net/manual/en/function.fpassthru.php 解释如何轻松输出二进制数据。

希望对你有帮助。

【讨论】:

以上是关于我应该如何从用 PHP 编写的 RESTful api 提供二进制文件(图像/音频)?的主要内容,如果未能解决你的问题,请参考以下文章

我如何从用 swift 编写的 iOS 中准确导出 csv 文件?

如何从用 C# 编写的抽象基类继承

如何从用 Swift 编写的 Flutter 平台特定代码启动 ViewController?

如何从用java编写的查询中将虚线字符串传递给oracle

如何从用 MFC (MSVC 2008) 编写的应用程序查询基于 CGI 的网络服务器并处理结果?

如何从用 asp.net 中的 scriptmanager.registerclientscript 编写的 javascript 确认框返回值?