上傳文件的HTML表單:
<form id='sign' method='post' action='upload.php' enctype='multipart/form-data'>
<h2>Choose the file to sign:</h2>
<input type='hidden' name='MAX_FILE_SIZE' value='1000000' />
<label for='userfile'>Upload a file:</label>
<input type='file' name='userfile' id='userfile' />
<input type='submit' value='Send File' />
</form>
有兩個需要注意的地方:
- 在<form>標記中,必須設置屬性enctype="multipart/form-data",這樣,服務器就可以知道上傳的文件帶有常規的表單信息。
- 必須有一個可以設置上傳文件最大長度的表單域。這是一個隱藏域,如下所示:
MAX_FILE_SIZE表單域是可選的,該值也可以在服務器端設置。然而,如果在這個表單中使用,表單域的名稱必須爲MAX_FILE_SIZE。
從HTML表單中獲得文件的PHP腳本:
<?php
if($_FILES['userfile']['error']>0){
echo 'Problem:';
switch($_FILES['userfile']['error']){
case 1:echo 'File exceeded upload_max_filesize';
break;
case 2:echo 'File exceeded max_file_size';
break;
case 3:echo 'File only partially uploaded';
break;
case 4:echo 'No file uploaded';
break;
case 6:echo 'Cannot upload file:No temp directory specified';
break;
case 7:echo 'Upload failed:Cannot write to disk';
break;
}
exit;
}
if($_FILES['userfile']['type']!='text/plain'){
echo 'Problem:file is not plain text';
exit;
}
$upfile='/uploads/'.$_FILES['userfile']['name'];
if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
if(!move_uploaded_file($_FILES['userfile']['tmp_name'],$upfile)){
echo 'Problem:Could not move file to destination directory';
exit;
}
}
else{
echo 'Problem:Possible file upload attack.Filename:';
echo $_FILES['userfile']['name'];
exit;
}
echo 'File uploaded successfully<br><br>';
$contents=file_get_contents($upfile);
$contents=strip_tags($contents);
file_put_contents($_FILES['userfile']['name'],$contents);
echo '<p>Preview of uploaded file contents:<br/><hr/>';
echo nl2br($contents);
echo '<br /><hr/>';
?>
- 存儲在$_FILES['userfile']['tmp_name']變量中的值就是文件在web服務器中臨時存儲的位置。
- 存儲在$_FILES['userfile']['name']變量中的值就是用戶系統中的文件名稱。
- 存儲在$_FILES['userfile']['size']變量中的值就是文件的字節大小。
- 存儲在$_FILES['userfile']['type']變量中的值就是文件的MIME類型,例如:text/plain或者image/gif。
- 存儲在$_FILES['userfile']['error']變量中的值將是任何與文件上傳相關的錯誤代碼。
以上腳本主要進行的操作是錯誤檢測,文件上傳存在潛在的安全風險,因此要儘量避免這些安全風險。
$_FILE['userfile']['error']中返回的錯誤代碼:
- UPLOAD_ERROR_OK,值爲0,表示沒有發生任何錯誤。
- UPLOAD_ERR_INI_SIZE,值爲1,表示上傳文件的大小超出了約定值。文件大小的最大值是在PHP配置文件中指定的,該指令是upload_max_filesize。
- UPLOAD_ERR_FORM_SIZE,值爲2,表示上傳文件的大小超出了HTML表單的MAX_FILE_SIZE元素所指定的最大值。
- UPLOAD_ERR_PARTIAL,值爲3,表示文件只被部分上傳。
- UPLOAD_ERR_FILE,值爲4,表示沒有上傳文件。
- UPLOAD_ERR_DIR,值爲6,表示在php.ini文件中沒有指定臨時目錄。
- UPLOAD_ERR_CANT_WRITE,值爲7,表示將文件寫入磁盤失敗。
使用scandir()函數對文件名稱進行字母表方式排序:
<?php
$dir='/uploads/';
$files1=scandir($dir);
$files2=scandir($dir,1);
echo "<p>Upload directory is $dir</p>";
echo '<p>Directory Listing in alphabetical order,ascending:</p><ul>';
foreach($files1 as $file){
if($file!="." &&$file!=".."){
echo "<li>$file</li>";
}
}
echo '</ul>';
echo "<p>Upload directory is $dir</p>";
echo '<p>Directory Listing in alphabetical,descending:</p><ul>';
foreach($files2 as $file){
if($file!="." &&$file!=".."){
echo "<li>$file</li>";
}
}
echo '</ul>';
?>
scandir()函數可以將文件名稱保存在一個數組,並且以字母表的順序排序,升序或者降序。
通常,.(當前目錄)和..(上級目錄)也會顯示在清單中。但是,使用瞭如下代碼,把它們過濾了:
<span style="white-space:pre"> </span>if($file!="." &&$file!="..")