2012-11-29 102 views
0

爲什麼下面不能識別圖像正在上傳(.jpg)?驗證上傳的文件類型

我收到上傳的文件不是圖片!

$finfo = finfo_open(FILEINFO_MIME_TYPE, 'C:\xampp\php\extras\magic\magic.mime'); 
if(strpos(finfo_file($finfo, $_FILES['userfile']['tmp_name']),"image")===0) {  

    // prepare the image for insertion 
    $imgData =addslashes (file_get_contents($_FILES['userfile']['tmp_name'])); 

    // put the image in the db... 
    // database connection 
    mysql_connect($host, $user, $pass) OR DIE (mysql_error()); 

    // select the db 
    mysql_select_db ($db) OR DIE ("Unable to select db".mysql_error()); 

    // our sql query 
    $sql = "INSERT INTO uploaded_images 
    (image, name) 
    VALUES 
    ('{$imgData}', '{$_FILES['userfile']['name']}');"; 

    // insert the image 
    mysql_query($sql) or die("Error in Query: " . mysql_error()); 
    $msg='<p>Image successfully saved in database with id ='. mysql_insert_id().' </p>'; 
} 
else 
    $msg="<p>Uploaded file is not an image.</p>"; 
+0

你存儲BLOB圖像數據嗎? –

+2

你正在使用'addslashes'來逃避你的二進制輸入。改爲使用'mysql_real_escape_string'或使用** PDO **並準備好語句。 – Halcyon

回答

0

檢測文件類型出人意料地不可靠。一些較簡單的低級文件類型檢測程序只是使用文件擴展名來嘗試和確定類型。

如果您有能力將其安裝在運行代碼的服務器上,最好使用專門用於圖像的工具,如imagemagick。這裏有一個例子,將告訴你該文件是否實際上是一個JPEG圖像,而不依賴於文件名:

​​

但是,如果您沒有權限才能安裝ImageMagick的,你可以使用GD庫。否則,你將不得不相信文件擴展名是正確的,或者只是相信文件是圖像。

在一個單獨的說明,這是很少一個好主意,將圖像保存在數據庫中,特別是如果他們再交付如渲染圖像。 MySQL的設計並非如此高效。最好將它們作爲文件存儲在可公開查看的目錄中。話雖如此,我不知道你的申請,所以你將最適合確定最佳的行動方案。