有没有办法知道只有数据的文件类型

时间:2013-12-09 15:10:49

标签: php

对于某些技术问题,我无法以传统方式将文件从输入发送到我的后端。我必须从文件中读取数据,将其绑定到模型并将该数据(作为一个巨大的字符串)发送到服务器。假设我的用户上传了一个.jpg,我的代码如下所示:

// This return the data in the form of a simple string.
$data = $this->getRequest()->request->get('document[document_file]', null, true);

// Let's assume that I know what type of file my user send me
$data = explode("data:image/jpeg;base64,", $file);
$data = base64_decode($data[1]);
$image = imagecreatefromstring($data);

imagejpeg($image, "test.jpg");

我的问题是我不知道我的用户将上传什么类型的文件。有没有办法找出它是什么类型的文件,并以更有效的方式保存它。处理这样一个问题的有效方法是什么?

编辑:有一点需要注意的是,它并不总是一个图像。它可以是.pdf,.doc,.txt!

2 个答案:

答案 0 :(得分:2)

由于您将图片的内容放在字符串中,因此您可以使用getimagesizefromstring(),其中包含一个mime字段,可以告诉您图片的类型。

$data = base64_decode($data[1]);
$info = getimagesizefromstring($data);
$mime = $info['mime'];

如果您需要支持任何文件,而不仅仅是图片,您需要编写自定义文件解析器,或者如果您拥有FileInfo PECL扩展名,则可以使用finfo_file()

$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, '/path/to/your/file.jpg');
finfo_close($finfo);

需要注意的是,您需要一个实际的文件,而不是一个字符串(但您总是可以将该字符串写入临时文件)。

编辑: 这是解决问题的答案,无需创建文件。我们从图像中获取以下数据:

data:image/jpeg;base64/9j/4AAQSkZJRgA [...] xD5epeRHJ4glkjk/sb7R5lrFJ5fmfu/wDv5W1TEV/5wp+58

您需要先解析它

$data = explode(",", $data);

然后将字符串插入缓冲区

$finfo->buffer(base64_decode($data[1]))

最后,使用the answer from @JohnErck来解决扩展类型。

file_put_contents($path . $filename . AppUtil::FileExt($data[1]), $data[1]);

答案 1 :(得分:0)

Unix工具“文件”会告诉你一个文件基于开头的“幻数” - 也许你可以fork / shell / call那个?

示例:

file sem.pl sean.zip Windows.pdf
sem.pl:   a /usr/bin/perl script text executable
sean.zip: Zip archive data, at least v1.0 to extract
Windows.pdf: PDF document, version 1.5