本人是一個新手代碼狗,第一次發表博客,歡迎大大們指點!
最近手頭有一個文件上傳下載的案例,跟大家一起分享一下作為一個新手的苦逼成長歷程!
話不多說,先上代碼:
一:這個是一個文件上傳的html頁面,小博做的是上傳圖片(gif、png和jpg格式,200KB以內);
初稿做的是單一上傳,后來改成的批量上傳,在input中將name的名字從file改成file[],然后加上multiple=“multiple”就可以了(選擇上傳文件時可以使用鼠標或者鍵盤進行批量選擇);
其實一開始小博是傻傻的用了N個input框進行上傳的!= =。
二:圖片的后臺處理;
{mkdir("./pic");
}$file=$_FILES['file'];//獲取傳輸文件數組;
foreach($file["name"] as $valuename){ //遍歷文件['name數組'];得到字符串:1.png.2.png.3.png.;
$value.=$valuename.".";
};$strr=substr($value,0,strlen($value)-1); //字符串更新:1.png.2.png.3.png(去掉最后一個.);
$strarr=explode(".", $strr); //獲得數組如:arr(1,png,2,png,3,png,4,png);
$filetypearr=[];foreach($strarr as $key=>$valuea){if($valuea!=""){ //去掉上傳過來的空值;
if($key%2!=0){$filetypearr[]=$valuea; //獲得新數組,如:arr(png,png,png);
}
}
}$typearr=array("png","jpg","gif"); //可上傳類型數組
function checktype($typearr,$type){ //判斷類型方法;
foreach($typearr as $value){if($value==$type){return true;
}
}return false;
}foreach($filetypearr as $key=>$valueb){ //判斷格式類型是否正確;
if(!checktype($typearr,$valueb)){echo "";header("Refresh:0.1;url=piliangfile.html");exit;
}
}for($i=0;$i1024*200){ //判斷文件大小是否符合,如果文件過大會提示該文件,符合的文件會繼續上傳,不符合的文件不上傳;
echo "";header("Refresh:0.1;url=picscan.php");
}else{ //存儲文件,并跳轉到文件展示頁面;
move_uploaded_file($file['tmp_name'][$i], "pic/".$file["name"][$i]);header("Refresh:0.1;url=picscan.php");
}
}?>
小博在實際過程中對于文件名符合類型但是大小過大的文件實行攔截,其他符合的會先一步上傳。(但是如果上傳的文件類型中有不符合的,批量上傳會中斷,沒有文件上傳);
三:文件展示頁面(主頁面)
ini_set('date.timezone','Asia/Shanghai'); //時區設置,東八區上海時間;
function format_bytes($size) { //文件大小轉換方法(字節轉換為KB,MB,GB,TB);
$units = array(' B', ' KB', ' MB', ' GB', ' TB');for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;return round($size, 2).$units[$i];
}?>
序號 | 文件名 | 圖片 | 大小 | 最后修改時間 | 全選 |
<?phpforeach ($picarr as $key=>$value){if($key>1){ //去掉前面的兩個空值;
echo "
";echo "".($key-1).""; //序號echo "
".$value.""; //文件名echo "
echo "
".format_bytes(filesize("pic/$value")).""; //filesize 獲取文件大小(單位:B);echo "
".date("Y-m-d H:i:s", filemtime("pic/$value")).""; //filemtime 獲取文件最后修改時間(單位:毫秒) date轉換時間echo "
"; //多選框傳值(傳的是文件名)echo "
";}
}?>
function chooseall(str){ //全選方法
var cholen=document.getElementsByName('del[]').length;for(i=0;i<=cholen;i++){
document.getElementsByName('del[]')[i].checked=str;
}
}
document.getElementById("all").οnclick=function(){ //全選事件
if(this.checked==true){
chooseall(true);
}else{
chooseall(false);
}
}
四:刪除與下載后臺處理頁面
$picname=$_POST['del'];foreach($picname as $value){unlink("pic/$value"); //刪除對應的文件;
}
}else if($_REQUEST['download']){$picname=$_POST['del'];if($picname!=''){ //去掉空值的情況(沒有選中任何項,無表單傳值)
foreach($picname as $value){if(!file_exists("pic/$value")){ //沒有該文件時無法下載;
echo "";header("location:picscan.php");
}else{$fp=fopen("pic/$value","r"); //打開文件指針;
$file_size=filesize("pic/$value"); //文件的大小;
Header("Content-type: application/octet-stream"); //告知瀏覽器下載的文件類型;
Header("Accept-Ranges: bytes"); //返回的文件大小按照字節計算;
Header("Accept-Length:".$file_size); //返回的文件大小;
Header("Content-Disposition: attachment; filename=".$value); //返回的文件的名稱;
$buffer=1024;$file_count=0;while(!feof($fp) && $file_count
}fclose($fp);
}
}
}
}elseif ($_REQUEST['downloadall'] ) { //一個表單多個提交按鈕,區分提交按鈕的name值;
$picname=$_POST['del'];if($picname!=''){ //去掉空值的情況(沒有選中任何項,無表單傳值)
$filename = "pic/download.zip"; //最終生成的文件名(含路徑)
if(!file_exists($filename)){ //重新生成文件
$zip = new ZipArchive();//使用本類,linux需開啟zlib,windows需取消php_zip.dll前的注釋
if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {exit('無法打開文件,或者文件創建失敗');
}foreach( $picname as $val){if(file_exists("pic/$val")){$zip->addFile( "pic/$val", basename($val));//第二個參數是放在壓縮包中的文件名稱,如果文件可能會有重復,就需要注意一下
}
}$zip->close();//關閉
}if(!file_exists($filename)){exit("無法找到文件"); //即使創建,仍有可能失敗。。。。
}header("Cache-Control: public");header("Content-Description: File Transfer");header('Content-disposition: attachment; filename='.basename($filename)); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進制文件
header('Content-Length: '. filesize($filename)); //告訴瀏覽器,文件大小
@readfile($filename);unlink($filename);
}
}header("location:picscan.php");?>
還有好幾個功能沒有實現(文件的排序,中文文件名的轉碼等,涉及到批量上傳下載,中文轉碼老是報錯,如果有哪位大神有空,還請指點一二),慢慢摸索中......