2013-12-09 31 views
2

对于一些技术问题的文件类型,我无法从我的输入将文件发送到我的后端的传统方式。我必须从文件读取数据,将其绑定到模型并将该数据(作为一个巨大的字符串)发送到服务器。比方说,我的用户上传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!

+0

试着看一下FileInfo的扩展:http://php.net/manual/pl/book.fileinfo.php,或者如果你期望的图像,你可以尝试使用检查文件'imagecreatefromstring ()''''getimagesizefromstring()'等,并检查错误。 – piotrekkr

+0

@piotrekkr我不知道这是否是一个图像,它可能是一个.doc,txt文件,.PDF,我会在FileInfo的 –

+1

我写'如果你希望image',如果你不确信我们来看一看: ) – piotrekkr

回答

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]); 
+0

所以我会保存没有扩展名的文件,然后从finfo中读取并从中扣除扩展名? –

+0

@MichaelVilleneuve是啊;文件类型不完全依赖于文件的扩展名(例如,可以保存为JPEG'img.png',它仍然会打开/渲染罚款)。 *几乎所有文件都有标题,声明他们的实际文件类型。 – newfurniturey

+0

我在上面,会回复你的结果,谢谢你的时间(不知道为什么有人低估你!) –

0

Unix的工具“文件”会告诉你什么文件是根据“幻数”在开始 - 也许你可以用叉子叉/壳/那算什么?

例子:

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 
相关问题