2014-02-18 43 views
3

我有一個PHP表單,它有五個輸入供用戶上傳五個圖像。用戶必須至少選擇一個圖像,並且必須在第一個輸入中,以便表單提交。表單將正確提交所有信息到MySQL表格中,除了圖片本身。例如,我提交了一個圖像,圖像列顯示[BLOB - 14 B],我相信它應該至少爲300 KB。我的理論是當圖像被提交到MySQL表格中時,圖像被壓縮成其他格式。PHP表單不是將圖像提交到MySQL表格

這是我的完整的PHP頁面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

    <html> 
    <head><title>File Upload To Database</title></head> 
    <body> 
    <h2>Please Choose a File and click Submit</h2> 
    <form enctype="multipart/form-data" action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post"> 
    <input type="hidden" name="MAX_FILE_SIZE" value="99999999" /> 
    <div><input name="userfile[]" type="file" /></div> 
    <div><input name="userfile[]" type="file" /></div> 
     <div><input name="userfile[]" type="file" /></div> 
     <div><input name="userfile[]" type="file" /></div> 
      <div><input name="userfile[]" type="file" /></div> 
    <div><input type="submit" value="Submit" /></div> 
    </form> 

</body></html> 

<?php 
/*** check if a file was submitted ***/ 
if(!isset($_FILES['userfile'])) 
    { 
    echo '<p>Please upload a display picture.</p>'; 
    } 
else 
    { 
    try { 
     upload(); 
     /*** give praise and thanks to the php gods ***/ 
     echo '<p>Thank you for submitting</p>'; 
     } 
    catch(Exception $e) 
     { 
     echo '<h4>'.$e->getMessage().'</h4>'; 
     } 
    } 

/* 
* Check the file is of an allowed type 
* Check if the uploaded file is no bigger thant the maximum allowed size 
* connect to the database 
* Insert the data 
*/ 

/** 
* 
* the upload function 
* 
* @access public 
* 
* @return void 
* 
*/ 
function upload(){ 

$maxsize = 99999999; 
$columnNames = ''; 
$columnValues = ''; 
$paramsToBeBound = array(); 

echo '<pre>' . print_r($_FILES, TRUE) . '</pre>'; 

/*** check if a file was uploaded ***/ 
for($i = 0; ($i < count($_FILES['userfile']['tmp_name']) && $i < 5); $i++) { 
    if($_FILES['userfile']['tmp_name'][$i] != '') { // check if file has been set to upload 
     if($_FILES['userfile']['error'][$i] == 0 && is_uploaded_file($_FILES['userfile']['tmp_name'][$i]) && getimagesize($_FILES['userfile']['tmp_name'][$i]) != false) { 
      /*** get the image info. ***/ 
      $size = getimagesize($_FILES['userfile']['tmp_name'][$i]); 
      /*** assign our variables ***/ 
      $type = $size['mime']; 
      $imgfp = fopen($_FILES['userfile']['tmp_name'][$i], 'rb'); 
      $size = $size[3]; 
      $name = $_FILES['userfile']['name'][$i]; 


      /*** check the file is less than the maximum file size ***/ 
      if($_FILES['userfile']['size'][$i] < $maxsize) 
       { 
        if($i > 0) { 
         $columnNames .= ', image_type' . $i . ', image' . $i . ', image_size' . $i . ', image_name' .$i; 
         $columnValues .= ', ?, ?, ?, ?'; 
        } else { 
         $columnNames .= 'image_type, image, image_size, image_name'; 
         $columnValues .= '?, ?, ?, ?'; 
        } 

        $paramsToBeBound[] = $type; 
        $paramsToBeBound[] = $imgfp; 
        $paramsToBeBound[] = $size; 
        $paramsToBeBound[] = $name; 
       } else 
        throw new Exception("File Size Error"); //throw an exception is image is not of type 
      } 
     else 
      { 
      // if the file is not less than the maximum allowed, print an error 
      throw new Exception("Unsupported Image Format of image!"); 
      } 
     } 
    } 
    if(count($paramsToBeBound) > 0) { 
     $dbh = new PDO("mysql:host=dsa.com;dbname=s_gbm", 'kss', 'Kisr'); 

     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

     $stmt = $dbh->prepare('INSERT INTO testblob (' . $columnNames . ') VALUES (' . $columnValues . ')'); 

     $i = 0; 
     foreach($paramsToBeBound as &$param) { 
      $i++; 
      if($i == 2 || $i - floor($i/4) == 2) { 
       $stmt->bindParam($i, $param, PDO::PARAM_LOB); 
      } else { 
       $stmt->bindParam($i, $param); 
      } 
     } 

     $stmt->execute(); 
    } 
} 


?> 

這是我在PHP MyAdmin SQL用來創建MySQL表代碼:

CREATE TABLE testblob (image_id tinyint(3) NOT NULL AUTO_INCREMENT, image_type varchar(25) NOT NULL, image longblob NOT NULL, image_size varchar(25) NOT NULL, image_name varchar(50) NOT NULL, image_type1 varchar(25) NOT NULL, image1 longblob NOT NULL, image_size1 varchar(25) NOT NULL, image_name1 varchar(50) NOT NULL, image_type2 varchar(25) NOT NULL, image2 longblob NOT NULL, image_size2 varchar(25) NOT NULL, image_name2 varchar(50) NOT NULL, image_type3 varchar(25) NOT NULL, image3 longblob NOT NULL, image_size3 varchar(25) NOT NULL, image_name3 varchar(50) NOT NULL, image_type4 varchar(25) NOT NULL, image4 longblob NOT NULL, image_size4 varchar(25) NOT NULL, image_name4 varchar(50) NOT NULL, image_ctgy varchar(25) NOT NULL, KEY image_id (image_id)) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

感謝您的任何幫助。我感謝所有幫助。

回答

3

首先,我建議不要在MySQL中存儲圖像,除非你絕對必須。

你絕對要嗎?是?那真不幸。這將有助於雖然...

$imgfp = fopen($_FILES['userfile']['tmp_name'][$i], 'rb'); 
$imageData = fread($imgfp, filesize($_FILES['userfile']['tmp_name'][$i])); 
$imageData = addslashes($imageData); 
fclose($imgfp); 
… 
… 
$paramsToBeBound[] = $imageData; 
+0

另一種方法是商店形象爲base64 - 多數民衆贊成,因爲你不需要重新處理的內容顯示像'background:url(data:image/png; base64,iVBORw0KGgoAAAANSUhEUgAAFWHRTb2Z0d2FyZQBBZG等...) ;'或img標籤 –

+0

@RagenDazs這真的是一個有趣的方法!感謝那個金塊。 –

+0

@PatrickQ Works,謝謝。 – Kelsey

2

你永遠不應該存儲在MySQL數據庫中任何媒體類型,你應該做的是存儲媒體文件不管是在本地硬盤上的圖片或視頻,然後讓MySQL的存儲文件這將在需要時調用該媒體類型。我希望這有助於(=

+0

永遠不要說永遠。 –

+0

雖然一個很好的評論,只是告訴別人不要做某事而不是特別的很好的答案,OP可能在某些情況下沒有其他選擇(儘管我真的希望事實並非如此,對於OP而言) –

+0

OP可以,例如,需要複製或在MySQL內部使用某些業務規則 –