php实现文件上传的程序代码

本文章来给初学者介绍一个简单的php实现文件上传的程序代码,大家可拿下去供学习使用,如果放到网络上应用我们需要更多过滤来判断了。

先来看实例

  1. <?php
  2. //判断临时文件存放路径是否包含用户上传的文件
  3. if(is_uploaded_file($_FILES["uploadfile"]["tmp_name"])){
  4. //为了更高效,将信息存放在变量中
  5. $upfile=$_FILES["uploadfile"];//用一个数组类型的字符串存放上传文件的信息
  6. //print_r($upfile);//如果打印则输出类似这样的信息Array ( [name] => m.jpg [type] => image/jpeg [tmp_name] => C:WINDOWSTempphp1A.tmp [error] => 0 [size] => 44905 )
  7. $name=$upfile["name"];//便于以后转移文件时命名
  8. $type=$upfile["type"];//上传文件的类型
  9. $size=$upfile["size"];//上传文件的大小
  10. $tmp_name=$upfile["tmp_name"];//用户上传文件的临时名称
  11. $error=$upfile["error"];//上传过程中的错误信息
  12. //echo $name;
  13. //对文件类型进行判断,判断是否要转移文件,如果符合要求则设置$ok=1即可以转移
  14. switch($type){
  15. case "image/jpg": $ok=1;
  16. break;
  17. case "image/jpeg": $ok=1;
  18. break;
  19. case "image/gif" : $ok=1;
  20. break;
  21. default:$ok=0;
  22. break;
  23. }
  24. //如果文件符合要求并且上传过程中没有错误
  25. if($ok&&$error=='0'){
  26. //调用move_uploaded_file()函数,进行文件转移
  27. move_uploaded_file($tmp_name,'up/'.$name);
  28. //操作成功后,提示成功
  29. echo "<script language="javascript">alert('succeed')</script>";
  30. }else{
  31. //如果文件不符合类型或者上传过程中有错误,提示失败
  32. echo "<script language="javascript">alert('failed')</script>";
  33. }
  34. }
  35. ?>
  36. <!--设置提交文件的表单-->
  37. <form enctype="multipart/form-data" method="post" name="uploadform">
  38. <input type="file" name="uploadfile" value="Upload File">
  39. <input type="submit" name="submit" value="Upload">
  40. </form>

上面的代码完全可以工作,但实际应用中漏洞百出,让我们逐步来完善之首先,上载的文件必须有一个固定的目录保存,我们在这里用一个$UploadPath变量保存之,如$UploadPath = "/home/flier/upload/"; 或复杂一点的自动定位,如

  1. $UploadPath = AddSlashes(dirname($PATH_TRANSLATED))."\upload\";

$PATH_TRANSLATED顾名思义是当前传送目录

我们假定以其一个名为upload的子目录来保存上载的文件。dirname函数返回其目录名,然后加上子目录名然后用一个变量$FileName保存完整的上载后文件名和路径 $FileName = $UploadPath.$UploadFile_name;

其次,我们还想让用户得知上载文件的简要信息,如上载文件的大小if($UploadFile_size <1024) { //上载文件大小

  1. $FileSize = (string)$UploadFile_size . "字节";
  2. }
  3. elseif($UploadFile_size <(1024 * 1024)) {
  4. $FileSize = number_format((double)($UploadFile_size / 1024), 1) . " KB";
  5. }
  6. else{
  7. $FileSize = number_format((double)($UploadFile_size / (1024 * 1024)), 1) . " MB";
  8. }

number_format函数起到格式化输出的作用,具体用法请参照手册。下一步我们必须考虑到文件已经存在和拷贝操作失败的情况,并提供相应的提示信息if(!file_exists($FileName)){

  1. if(copy($UploadFile,$FileName)) {
  2. echo "文件 $UploadFile_name($FileSize)上载成功!";
  3. }
  4. else {
  5. echo "文件 $UploadFile_name上载失败!";
  6. }
  7. unlink($UploadFile);
  8. }
  9. else {
  10. echo "文件 $UploadFile_name已经存在!";
  11. }

然后我们应该考虑到大文件上载时容易出现超时的情况,可以用set_time_limit($TimeLimit);加大超时限制时间。

最后,把截面和实现代码综合到一个单独的文件中,为了实现这个想法,我们通过在 form中添加一个隐含值<INPUT TYPE = "hidden" NAME = "UploadAction" VALUE = "1">指出当前的状态(界面或实现),以便区分对待

下面程序可用于实例应用

  1. function FileUpload( $resourceType, $currentFolder, $sCommand )
  2. {
  3. if (!isset($_FILES)) {
  4. global $_FILES;
  5. }
  6. $sErrorNumber = '0' ;
  7. $sFileName = '' ;
  8. if ( isset( $_FILES['NewFile'] ) && !is_null( $_FILES['NewFile']['tmp_name'] ) )
  9. {
  10. global $Config ;
  11. $oFile = $_FILES['NewFile'] ;
  12. // Map the virtual path to the local server path.
  13. $sServerDir = ServerMapFolder( $resourceType, $currentFolder, $sCommand ) ;
  14. // Get the uploaded file name.
  15. $sFileName = $oFile['name'] ;
  16. $sFileName = SanitizeFileName( $sFileName ) ;
  17. $sOriginalFileName = $sFileName ;
  18. // Get the extension.
  19. $sExtension = substr( $sFileName, ( strrpos($sFileName, '.') + 1 ) ) ;
  20. $sExtension = strtolower( $sExtension ) ;
  21. if ( isset( $Config['SecureImageUploads'] ) )
  22. {
  23. if ( ( $isImageValid = IsImageValid( $oFile['tmp_name'], $sExtension ) ) === false )
  24. {
  25. $sErrorNumber = '202' ;
  26. }
  27. }
  28. if ( isset( $Config['HtmlExtensions'] ) )
  29. {
  30. if ( !IsHtmlExtension( $sExtension, $Config['HtmlExtensions'] ) &&
  31. ( $detectHtml = DetectHtml( $oFile['tmp_name'] ) ) === true )
  32. {
  33. $sErrorNumber = '202' ;
  34. }
  35. }
  36. // Check if it is an allowed extension.
  37. if ( !$sErrorNumber && IsAllowedExt( $sExtension, $resourceType ) )
  38. {
  39. $iCounter = 0 ;
  40. while ( true )
  41. {
  42. $sFilePath = $sServerDir . $sFileName ;
  43. if ( is_file( $sFilePath ) )
  44. {
  45. $iCounter++ ;
  46. $sFileName = RemoveExtension( $sOriginalFileName ) . '(' . $iCounter . ').' . $sExtension ;
  47. $sErrorNumber = '201' ;
  48. }
  49. else
  50. {
  51. move_uploaded_file( $oFile['tmp_name'], $sFilePath ) ;
  52. if ( is_file( $sFilePath ) )
  53. {
  54. if ( isset( $Config['ChmodOnUpload'] ) && !$Config['ChmodOnUpload'] )
  55. {
  56. break ;
  57. }
  58. $permissions = 0777;
  59. if ( isset( $Config['ChmodOnUpload'] ) && $Config['ChmodOnUpload'] )
  60. {
  61. $permissions = $Config['ChmodOnUpload'] ;
  62. }
  63. $oldumask = umask(0) ;
  64. chmod( $sFilePath, $permissions ) ;
  65. umask( $oldumask ) ;
  66. }
  67. break ;
  68. }
  69. }
  70. if ( file_exists( $sFilePath ) )
  71. {
  72. //previous checks failed, try once again
  73. if ( isset( $isImageValid ) && $isImageValid === -1 && IsImageValid( $sFilePath, $sExtension ) === false )
  74. {
  75. @unlink( $sFilePath ) ;
  76. $sErrorNumber = '202' ;
  77. }
  78. else if ( isset( $detectHtml ) && $detectHtml === -1 && DetectHtml( $sFilePath ) === true )
  79. {
  80. @unlink( $sFilePath ) ;
  81. $sErrorNumber = '202' ;
  82. }
  83. }
  84. }
  85. else
  86. $sErrorNumber = '202' ;
  87. }
  88. else
  89. $sErrorNumber = '202' ;
  90. $sFileUrl = CombinePaths( GetResourceTypePath( $resourceType, $sCommand ) , $currentFolder ) ;
  91. $sFileUrl = CombinePaths( $sFileUrl, $sFileName ) ;
  92. SendUploadResults( $sErrorNumber, $sFileUrl, $sFileName ) ;
  93. exit ;