鑑於上一篇《PHP上傳圖片到數據庫並能夠進行顯示》連接描述有筆友提出了改進意見,下面這篇文章就是採納改進意見進行修改的另一種方案。php
一、建立數據表html
CREATE TABLE image( id int(4) unsigned NOT NULL AUTO_INCREMENT, name varchar(100) default NULL, path varchar(100) default NULL, time timestamp default CURRENT_TIMESTAMP, PRIMARY KEY(id) )engine=myisam DEFAULT charset=utf8
二、新建一個uploads文件夾
uploads文件夾下面新建一個images文件夾(用來存放上傳後的圖片的文件夾)
,建立index.php(用於點擊選擇文件後提交的頁面),upimage.php(實現圖片上傳的代碼存放),getimage.php(實現圖片顯示的代碼存放)
mysql
三、用於點擊選擇文件後提交頁面的index.phpsql
<!doctype html> <html> <head> <meta charset="UTF-8"> <title>圖片上傳和下載</title> </head> <body> <center> <h2>文件上傳</h2> <!-- 文件上傳得form表單 --> <form action="upimage.php" method="post" enctype="multipart/form-data"> 上傳圖片: <input type="file" name="pic"> <input type="submit" value="上傳"> </form> </center> </body> </html>
三、實現圖片上傳的代碼存放數據庫
<?php //1.獲取上傳文件信息 $upfile=$_FILES["pic"]; //定義容許的類型 $typelist=array("image/jpeg","image/jpg","image/png","image/gif"); $path="./images/";//定義一個上傳後的目錄 //2.過濾上傳文件的錯誤號 if($upfile["error"]>0){ switch($upfile['error']){//獲取錯誤信息 case 1: $info="上傳得文件超過了 php.ini中upload_max_filesize 選項中的最大值."; break; case 2: $info="上傳文件大小超過了html中MAX_FILE_SIZE 選項中的最大值."; break; case 3: $info="文件只有部分被上傳"; break; case 4: $info="沒有文件被上傳."; break; case 5: $info="找不到臨時文件夾."; break; case 6: $info="文件寫入失敗!";break; }die("上傳文件錯誤,緣由:".$info); } //3.本次上傳文件大小的過濾(本身選擇) if($upfile['size']>100000){ die("上傳文件大小超出限制"); } //4.類型過濾 if(!in_array($upfile["type"],$typelist)){ die("上傳文件類型非法!".$upfile["type"]); } //5.上傳後的文件名定義(隨機獲取一個文件名) $fileinfo=pathinfo($upfile["name"]);//解析上傳文件名字 do{ $newfile=date("YmdHis").rand(1000,9999).".".$fileinfo["extension"]; }while(file_exists($path.$newfile)); //6.執行文件上傳 //判斷是不是一個上傳的文件 if(is_uploaded_file($upfile["tmp_name"])){ //執行文件上傳(移動上傳文件) if(move_uploaded_file($upfile["tmp_name"],$path.$newfile)){ echo "文件上傳成功!"; //將文件名和路徑存儲到數據庫 $dbms = 'mysql'; //數據庫類型 $host = 'localhost'; //數據庫主機名 $dbName = 'smart_lock'; // 使用的數據庫 $user = 'root'; //數據庫鏈接用戶名 $pass = '123456'; //對應的密碼 $dsn ="mysql:host = $host;dbname=$dbName"; $pdo = new PDO($dsn,$user,$pass); $data = addslashes(fread(fopen($pic,"r"),filesize($pic))); //將圖片的名稱和路徑存入數據庫 $query = "INSERT INTO image(name,path)VALUES('$newfile','$path$newfile')"; $result = $pdo -> query($query); if($result){ echo"文件已存儲到數據庫"; } else{ echo"請求失敗,請重試"; } }else{ die("上傳文件失敗!"); } }else{ die("不是一個上傳文件!"); } ?>
四、實現圖片顯示的getimage.phppost
<?php //$id = isset($_GET['id'])?intval($_GET['id']):1; //$id = $_GET['id']; $id = 2; //id正常應該是經過用戶填入的id獲取(客戶端發送過來的查詢數據id) $dbms = 'mysql'; //數據庫類型 $host = 'localhost'; //數據庫主機名 $dbName = 'smart_lock'; // 使用的數據庫 $user = 'root'; //數據庫鏈接用戶名 $pass = '123456'; //對應的密碼 $dsn = "mysql:host = $host;dbname=$dbName"; $pdo = new PDO($dsn,$user,$pass); $query = "select name,path from image where id=$id"; //數據查詢 $result = $pdo->query($query); if($result){ $result = $result->fetchAll(2); echo "<img src=".$result[0]['path'].">"; // $path="./uploads/";//定義一個上傳後的目錄 // echo "<img src=$path".$result[0]['name'].">"; } else{ echo "Handle errors"; } ?>
五、運行結果
(1)圖片上傳成功後在數據庫中的存儲以下
fetch
運行getimage.php文件最終顯示上傳的圖片以下
spa
最後打開images文件還能夠看到上傳的圖片均已保存在該文件夾中。code
結語:本人剛接觸PHP不久,自知能力不夠水平有限,該文中若存在什麼不足或需改進之處還請你們多多指正。orm