2013-12-09 82 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 
相關問題