如何检测图像字段的API帖子是文件,base64字符串还是图像URL?

时间:2016-12-13 19:43:35

标签: php laravel api image-uploading

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

在我的图片字段中,我目前只是在我的数据库中存储一个图片网址,这需要前端应用程序处理上传图片,然后再将其保存到我的API。

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

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

我的API将检测传入图像字段发布的3种类型中的哪一种,并根据需要进行处理。二进制文件将上传文件并将本地图像URL保存到数据库,Base64图像也将保存到本地图像并将URL保存到DB,远程图像URL将使用类似cURL的内容下载图像并保存本地图像DB的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字符串?

2 个答案:

答案 0 :(得分:2)

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

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

最后,您可以查找以http开头或更智能的字符串并查找域格式,例如:

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

希望这有帮助!

答案 1 :(得分:1)

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

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