把php上傳檔案時常碰到的幾個問題總結一下吧,以後用到時不用再去找了。
1.先做個最簡單的上傳檔案
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html>
<?php if (($_FILES["file"]["size"] < 20000) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; if ( file_exists ("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " already exists. "; } else { move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "Stored in: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "Invalid file"; } ?>
2.然後了解超級全域變數$_FILES的值
#$_FILES['userfile']['name'] $_FILES['userfile']['type'] $_FILES['userfile']['size'] $_FILES['userfile']['tmp_name'] $_FILES['userfile']['error']
其中,$_FILES['userfile']['error']的所有值:
UPLOAD_ERR_OK 其值為0,沒有錯誤發生,檔案上傳成功。
UPLOAD_ERR_INI_SIZE 其值為 1,上傳的檔案超過了 php.ini 中 upload_max_filesize 選項限制的值。
UPLOAD_ERR_FORM_SIZE 其值為 2,上傳檔案的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
UPLOAD_ERR_PARTIAL 其值為 3,檔案只有部分被上傳。
UPLOAD_ERR_NO_FILE 其值為 4,沒有檔案被上傳。
UPLOAD_ERR_NO_TMP_DIR 其值為 6,找不到臨時資料夾。 PHP 4.3.10 和 PHP 5.0.3 引進。
UPLOAD_ERR_CANT_WRITE 其值為 7,檔案寫入失敗。 PHP 5.1.0 引進。
3.很多情況:需要嚴格判斷上傳檔案類型
我們知道使用$_FILES['userfile']['type']判斷上傳檔案類型是一個很不明智的做法,因為該判斷依據是文件的後綴名,任何人都可以將一個mp3文件的後綴改成jpg從而偽裝成圖片進行上傳,因此php官方建議使用php的擴展php_fileinfo來判斷文件的mime,開啟拓展的方法百度一下有很多,win和linux略有不同。
4.情境一:上傳檔案重名後自動重新命名
if (file_exists("./upload/" . $_FILES["file"]["name"])) { do{ $suffix =""; $suffix_length = 4; $str = "0123456789abcdefghijklmnopqrstuvwxyz"; $len = strlen($str)-1; //文件名后追加4个随机字符 for($i=0 ; $i<$suffix_length; $i++){ $suffix .= $str[rand(0,$len)]; } $upload_filename = $_FILES['file']['name']; $filename = substr($upload_filename,0,strrpos($upload_filename,".")).$suffix.".".substr($upload_filename,strrpos($_FILES["file"]["name"],".")+1); }while(file_exists("./upload/".$filename)); move_uploaded_file($_FILES["file"]["tmp_name"],"./upload/" . $filename); }else{ move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); }
5.情境二:依日期分目錄上傳檔案
$structure = './'.date("Y").'/'.date("m").'/'.date("d").'/'; if (!mkdir($structure, 0777, true)) { die('Failed to create folders...'); } move_uploaded_file($_FILES["file"]["tmp_name"],$structure . $_FILES["file"]["name"]);
6.情境三:多重檔案上傳
<form action="" method="post" enctype="multipart/form-data"> <p>Pictures: <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="file" name="pictures[]" /> <input type="submit" value="Send" /> </p> </form>
<?php foreach ($_FILES["pictures"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["pictures"]["tmp_name"][$key]; $name = $_FILES["pictures"]["name"][$key]; move_uploaded_file($tmp_name, "data/$name"); } } ?>
有的情況下多檔案的這種變數結構並不好用:
array(1) { ["upload"]=>array(2) { ["name"]=>array(2) { [0]=>string(9)"file0.txt" [1]=>string(9)"file1.txt" } ["type"]=>array(2) { [0]=>string(10)"text/plain" [1]=>string(10)"text/html" } } }
#很多情況下我們需要的是類似這樣的結構
array(1) { ["upload"]=>array(2) { [0]=>array(2) { ["name"]=>string(9)"file0.txt" ["type"]=>string(10)"text/plain" }, [1]=>array(2) { ["name"]=>string(9)"file1.txt" ["type"]=>string(10)"text/html" } } }
使用下面的函數就能輕鬆轉換結構
function perse_array($vector) { $result = array(); foreach($vector as $key1 => $value1) foreach($value1 as $key2 => $value2) $result[$key2][$key1] = $value2; return $result; } $upload = perse_array($_FILES["upload"]);
7. 有的時候:需要設定伺服器修改最大上傳檔案大小
首先,在表單上
可以限制上傳檔案大小(可以被繞過)。
然後在伺服器上也需要調整一下設定
php.ini:
max_execution_time = 30 每個腳本運行的最長時間,單位秒
max_input_time = 60,每個腳本可以消耗的時間,單位也是秒
memory_limit = 128M,這個是腳本運行最大消耗的內存
post_max_size = 8M,表單提交最大數據為8M,此項不是限制上傳單個文件的大小,而是針對整個表單的提交資料進行限制的。
upload_max_filesize = 2M ,上載檔案的最大授權大小
nginx:
location / { root html; index index.html index.htm; client_max_body_size 1000m; }
以上是php檔案上傳問題總表的詳細內容。更多資訊請關注PHP中文網其他相關文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1
強大的PHP整合開發環境