【问题标题】:How to detect if an API post for an image field is a file, base64 string, or image URL?如何检测图像字段的 API 帖子是文件、base64 字符串还是图像 URL?
【发布时间】:2017-04-28 23:57:48
【问题描述】:

我有一个 PHP Laravel 应用程序,它被用作我的前端 JavaScript 应用程序的 API。

在我的图片字段中,我目前只是在我的数据库中存储了一个图片 URL,这需要前端应用在发布之前处理上传图片以将其保存到我的 API。

我的目标是让我的所有 API 图像字段都接受以下任何一种:

  • 二进制文件上传
  • 图片的 Base64 数据
  • 远程图像的 URL

然后,我的 API 会检测传入的图像字段帖子是 3 种类型中的哪一种,并根据需要进行处理。二进制文件将上传文件并将本地图像 URL 保存到数据库,Base64 图像也将保存到本地图像并将 URL 保存到数据库,远程图像 URL 将使用 cURL 之类的东西下载图像并保存本地图像数据库的 URL。

我所描述的我想做的是类似于 imgur.com 的 API。以下是通过其 API 创建新图像的 API 规范:

使用 imgur.com API 上传新图片

Method  POST
Route   https://api.imgur.com/3/image

Parameters
Key        Required      Description
------------------------------------
image      required      A binary file, base64 data, or a URL for an image. (up to 10MB)

所以我现在的问题是,使用 PHP:如何检测我的图像字段的 POST 是图像文件、Base64 字符串还是图像 URL 字符串?

【问题讨论】:

    标签: php laravel api image-uploading


    【解决方案1】:

    我想一个真实的图像文件会以多部分附件的形式提供给您。因此,您可以通过嗅探$_FILES 数组来检测到这一点:如果那里有图像,则将真实图像文件上传到您的 API。具体来说,在 Laravel 中,你会使用 $request->file

    否则,您将在请求的数据中包含一个字符串值。您可以嗅出该值:如果它以 data:image 开头,则它是编码图像。

    最后,您可以查找以 http 开头的字符串,或者更聪明地查找域格式,例如:

    /http(?:s)?:\/\/(?:[\w-]+\.)*([\w-]{1,63})(?:\.(?:\w{3}|\w{2}))(?:$|\/)/i
    

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      Base64 不允许您通常在 url 中找到的“:”字符,或者如果您只打算支持这些协议,则可以检查“http://”和“https://”。

      帖子中的文件可以在 $_FILES 中找到,或者使用 laravel,您可以使用 https://laravel.com/docs/5.3/requests 中提到的 hasFile() 函数检查文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-06
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 2016-01-03
        • 2020-12-22
        • 2011-08-29
        • 1970-01-01
        相关资源
        最近更新 更多