今天做項(xiàng)目的時(shí)候碰見(jiàn)一個(gè)問(wèn)題:之前一個(gè)同事離職之前做了一個(gè)網(wǎng)站,有一個(gè)上傳商品詳細(xì)圖片的功能,當(dāng)時(shí)已經(jīng)完成,但是由于后期程序的有更改以及更改的程序員的水平也是參差不齊,最后導(dǎo)致程序bug很多,由于當(dāng)時(shí)用的是一個(gè)框架,最終也沒(méi)找到說(shuō)明文檔,后來(lái)我就重新寫(xiě)了一個(gè)結(jié)合ajax上傳文件的upload.classs.php雖然界面欠缺美觀,但是通俗易懂好維護(hù).
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括恩陽(yáng)網(wǎng)站建設(shè)、恩陽(yáng)網(wǎng)站制作、恩陽(yáng)網(wǎng)頁(yè)制作以及恩陽(yáng)網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,恩陽(yáng)網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到恩陽(yáng)省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
//首先是頁(yè)面.
index.php
$(":file").change(function(){
if(!$(this).val())
{
alert('請(qǐng)選擇圖片!');
return false;
}
$("#picform").ajaxSubmit({
type:'post',
url:'upload.php',
success:function(data){
switch(data)
{
case '0':
alert('文件存放目錄不存在');
break;
case '1':
alert('系統(tǒng)錯(cuò)誤,請(qǐng)檢查環(huán)境配置');
break;
case '2':
alert('文件類型不允許');
break;
case '3':
alert('文件大小有誤');
break;
default:
var obj= $.parseJSON(data);
//生成縮略圖
$("#pics").append("");
var len= $("#infofrom :hidden").length;
if(len==0)
{
$("#infofrom").append("");
$("#infofrom").append("");
$("#infofrom").append("");
}
else
{
$("#picname").val($("#picname").val()+','+obj.picname);
$("#picpath").val($("#picpath").val()+','+obj.picpath);
$("#relpicpath").val($("#relpicpath").val()+','+obj.relpicpath);
}
break;
}
}
})
})
//接收前臺(tái)ajax的頁(yè)面
upload.php
include_once 'Upload.class.php';
$obj=new Upload('uploads',array('.jpg'),3145728,'file');
$arr=$obj->uploadFiles();
if(is_array($arr))
{
echo json_encode($arr);
}
else
{
echo $arr;
}
?>
//簡(jiǎn)單的文件上傳類
upload.class.php
//文件上傳類
class Upload{
private $path; //上傳路徑
private $allowtype=array(); //資源類型
private $maxsize; //允許上傳的文件大小
private $file; //file表單的name
private $error=1; //定義路徑不存在的錯(cuò)誤
//構(gòu)造方法
public function __construct($path,$allowtype,$maxsize,$file)
{
$this->path = $path;
//首先檢查文件路徑是否存在
if(!file_exists($this->path))
{
$this->error=0;
// exit('ERROR:文件路徑不存在!');
}
$this->allowtype = $allowtype;
$this->maxsize = $maxsize;
$this->file = $file;
}
//上傳一個(gè)資源的方法
public function uploadFiles()
{
if($this->error==0)
{
return 0;
}
//首先判斷系統(tǒng)是否允許上傳,以及有沒(méi)有出現(xiàn)error
$eor= $_FILES[$this->file]['error'];
if($eor!=0)
{
return 1;//異步傳輸專用
// exit("ERROR:錯(cuò)誤編號(hào):{$eor}!");
}
//判斷文件的擴(kuò)展名
$suf= strrchr($_FILES[$this->file]['name'],'.');
if(!in_array($suf,$this->allowtype))
{
return 2;
// exit('ERROR:文件類型被拒絕!');
}
//判斷文件的大小
$size= $_FILES[$this->file]['size'];
if($size>$this->maxsize)
{
return 3;
// exit('ERROR:文件過(guò)大!');
}
/*當(dāng)滿足上面所有的條件的時(shí)候,進(jìn)行文件上傳
并且返回資源的絕對(duì)路徑
相對(duì)路徑
以及文件名*/
$tempname = $_FILES[$this->file]['tmp_name'];
date_default_timezone_set('PRC');
$newname = date('YmdHis').'-'.mt_rand(100,999).$suf;
$rootpath=dirname(__FILE__).'/'.$this->path.'/'.$newname;
if(move_uploaded_file($tempname,$this->path.'/'.$newname))
{
return array('picname'=>$newname,'picpath'=>$rootpath,'relpicpath'=>$this->path.'/'.$newname);
}
}
}
?>
//前臺(tái)頁(yè)面提交表單后的入庫(kù)頁(yè)面
model.php
$dbh=new PDO('MySQL:host=localhost;dbname=test;','root','');
$dbh->exec('set names utf8');
$_POST['picpath']=addslashes(str_replace('/', '\\', $_POST['picpath']));
$sql="insert into mytab (picname,picpath,relpicpath) values
('$_POST[picname]','$_POST[picpath]','$_POST[relpicpath]')";
$info=$dbh->exec($sql);
?>
//解釋:頁(yè)面非常的簡(jiǎn)單,當(dāng)然這是測(cè)試用的.
邏輯過(guò)程:
1.前臺(tái)頁(yè)面index.php:第一個(gè)表單專門(mén)用來(lái)添加圖片.通過(guò)change事件觸發(fā)當(dāng)前表單提交事件.
2.在提交的upload.php頁(yè)面中,引入upload.class.php.通過(guò)數(shù)字注釋可以得到每個(gè)不同的錯(cuò)誤返回(在index.php中頁(yè)面底部的js部分),當(dāng)上傳成功的時(shí)候返回圖片的絕對(duì)地址(更新或者刪除數(shù)據(jù)的時(shí)候以便刪除沒(méi)用的圖片),圖片的名稱,以及圖片的相對(duì)地址(頁(yè)面展示使用).
3.upload.class.php的返回值通過(guò)upload.php進(jìn)行進(jìn)一步的判斷,如果是數(shù)組說(shuō)明上傳成功,如果是單個(gè)的數(shù)字,說(shuō)明上傳失敗.并且將信息返回給前臺(tái).
4.index.php接收到upload.php返回的信息,如果為單個(gè)數(shù)字的話,進(jìn)行相應(yīng)的錯(cuò)誤提醒.如果是一個(gè)json格式的數(shù)據(jù),那個(gè)通過(guò)$.parseJSON將其轉(zhuǎn)變成json對(duì)象,并且在下面的js代碼中進(jìn)行調(diào)用. 分別為:在頁(yè)面的第二個(gè)form表單中創(chuàng)建input:hidden,將所需要的信息存儲(chǔ)起來(lái)以便在提交表單的時(shí)候進(jìn)行使用.同時(shí)這里也做了一個(gè)判斷,如果第二個(gè)form表單中已經(jīng)存在樂(lè)hidden說(shuō)明已經(jīng)不是第一張圖片了,所以直接將之后的圖片拼接在hidden的value后面.同時(shí),如果成功的話在id為pics的div中會(huì)出現(xiàn)100*100縮略圖.
5.最后在index.php中點(diǎn)擊submit提交所有的圖片信息準(zhǔn)備入庫(kù).在model.php中,直接實(shí)例化了pdo,寫(xiě)了一條sql語(yǔ)句進(jìn)行了測(cè)試,結(jié)果沒(méi)有問(wèn)題.
注意:index.php中要引入:jquery.form.js
在model.php中addslashes()函數(shù)很重要,在數(shù)據(jù)庫(kù)中單獨(dú)的一條斜線"\"在我本次的測(cè)試中在數(shù)據(jù)庫(kù)中這條斜線就不見(jiàn)了.之前也碰掉類似的問(wèn)題,當(dāng)時(shí)是沒(méi)有插入進(jìn)去.所以在這里進(jìn)行一次轉(zhuǎn)義.
到此整個(gè)過(guò)程完成.
作為一個(gè)php新人,希望在這里和大家共同進(jìn)步,這個(gè)程序可能安全行,性能什么的我都沒(méi)有考慮到,用起來(lái)可能也有一定的局限性.希望大家多多指點(diǎn).