php上传图片学习笔记与心得

我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持.在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组.这些数组将包含所有关于您上传的文件的信息,其中,我们推荐您使用 $_FILES.

如果 PHP 的设置选项 register_globals 为 on,则相关的变量名将也会存在.从 PHP 4.2.0 版本开始,register_globals 的默认值被设为 off.

我们假设文件上传字段的名称为 userfile.名称可随意命名.

$_FILES['userfile']['name']

客户端机器文件的原名称.

$_FILES['userfile']['type']

文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”.

$_FILES['userfile']['size']

已上传文件的大小,单位为字节.

$_FILES['userfile']['tmp_name']

文件被上传后在服务端储存的临时文件名.

$_FILES['userfile']['error']

和该文件上传相关的错误代码.['error'] 是在 PHP 4.2.0 版本中增加的.

处理函数:

move_uploaded_file() (PHP 4 >= 4.0.3, PHP 5)

move_uploaded_file -- 将上传的文件移动到新位置

说明

bool move_uploaded_file ( string filename, string destination )

本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的).如果文件合法,则将其移动为由 destination 指定的文件.

如果 filename 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 FALSE.如果 filename 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 FALSE.此外还会发出一条警告.

如果目标文件已经存在,将会被覆盖.

实例代码如下:

  1. if(move_uploaded_file($_FILES["magfile"]["tmp_name"], $uploaddir))
  2. {
  3. echo "Update OK!";
  4. }

也可用copy(PHP 3, PHP 4, PHP 5)copy -- 拷贝文件bool copy ( string source, string dest )将文件从 source 拷贝到 dest.如果成功则返回 TRUE,失败则返回 FALSE.

提交页实例代码如下:

  1. <form action="." method="post" enctype="multipart/form-data" name="UL">
  2. <!--这里的‘enctype="multipart/form-data" ’是必须的-->
  3. <input type="file" name="picurl" size="15"
  4. accept="image/x-png,image/gif,image/jpeg">
  5. <input type="submit" name="upload" value="上传">
  6. </form>

处理页实例代码如下:

  1. if($_FILES['picurl']['size'] > 0){
  2. if(move_uploaded_file ($_FILES['picurl']['tmp_name'], $_FILES['picurl']['name'])){
  3. echo "图片上传成功";
  4. }
  5. }

其它非File类型的表单,可照样用$_POST['name']来接收.

php上传图片简单实现实例代码如下:

  1. <html>
  2. <head>
  3. <title>PHP上传图片简单实现 </title>
  4. </head>
  5. <body>
  6. <?php
  7. if($_GET['action'] == 'upfile')
  8. {
  9. $target_path = 'temp_'.$_FILES['photo']['name'];
  10. echo '上传的临时文件:' .$_FILES['photo']['tmp_name'] . '<br/>';
  11. echo '上传的目标文件:' .$target_path . '<br/>';
  12. echo $_SERVER["SCRIPT_FILENAME"] . '<br/>';
  13. echo $_SERVER["OS"] . '<br/>';
  14. //测试函数: move_uploaded_file
  15. //也可以用函数:copy
  16. move_uploaded_file($_FILES['photo']['tmp_name'], $target_path);
  17. echo "Upload result:";
  18. if(file_exists($target_path)) {
  19. if($_SERVER["OS"]!="Windows_NT"){
  20. @chmod($target_path,0604);
  21. }
  22. echo '<font color="green">Succeed!</font><br /><a href="http://' .$_SERVER["SERVER_NAME"] . "/" .$target_path .'"><img src=' .$target_path .' >';
  23. } else {
  24. echo '<font color="red">Failed!</font>';
  25. }
  26. exit;
  27. }
  28. ?>
  29. <h1>Registration</h1>
  30. <form action="upload.php?action=upfile" method="post" name="UForm" enctype="multipart/form-data">
  31. <fieldset>
  32. <legend>Your information</legend>
  33. <ul>
  34. <li>Your Phot<input type="file" name="photo"></li>
  35. </ul>
  36. </fieldset>
  37. <button type="submit">上传</button>
  38. </form>
  39. </body>
  40. </html>
  41. 上面代码只适用于学习使用,如果想使用在现在的服务器上我们必须如下写法
  42. 实例代码如下:
  43. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  44. <?php
  45. /******************************************************************************
  46. 参数说明:
  47. $max_file_size : 上传文件大小限制, 单位BYTE
  48. $destination_folder : 上传文件路径
  49. $watermark : 是否附加水印(1为加水印,其他为不加水印);
  50. 使用说明:
  51. 1. 将PHP.INI文件里面的"extension=php_gd2.dll"一行前面的;号去掉,因为我们要用到GD库;
  52. 2. 将extension_dir =改为你的php_gd2.dll所在目录;
  53. ******************************************************************************/
  54. //上传文件类型列表
  55. $uptypes=array(
  56. 'image/jpg',
  57. 'image/jpeg',
  58. 'image/png',
  59. 'image/pjpeg',
  60. 'image/gif',
  61. 'image/bmp',
  62. 'image/x-png'
  63. );
  64. $max_file_size=2000000; //上传文件大小限制, 单位BYTE
  65. $destination_folder="uploadimg/"; //上传文件路径
  66. $watermark=1; //是否附加水印(1为加水印,其他为不加水印);
  67. $watertype=1; //水印类型(1为文字,2为图片)
  68. $waterposition=1; //水印位置(1为左下角,2为右下角,3为左上角,4为右上角,5为居中);
  69. $waterstring="http://www.111cn.net/"; //水印字符串
  70. $waterimg="xplore.gif"; //水印图片
  71. $imgpreview=1; //是否生成预览图(1为生成,其他为不生成);
  72. $imgpreviewsize=1/2; //缩略图比例
  73. ?>
  74. <html>
  75. <head>
  76. <title>ZwelL图片上传程序</title>
  77. <style type="text/css">
  78. <!--
  79. body
  80. {
  81. font-size: 9pt;
  82. }
  83. input
  84. {
  85. background-color: #66CCFF;
  86. border: 1px inset #CCCCCC;
  87. }
  88. -->
  89. </style>
  90. </head>
  91. <body>
  92. <form enctype="multipart/form-data" method="post" name="upform">
  93. 上传文件:
  94. <input name="upfile" type="file">
  95. <input type="submit" value="上传"><br>
  96. 允许上传的文件类型为:<?=implode(', ',$uptypes)?>
  97. </form>
  98. <?php
  99. if ($_SERVER['REQUEST_METHOD'] == 'POST')
  100. {
  101. if (!is_uploaded_file($_FILES["upfile"][tmp_name]))
  102. //是否存在文件
  103. {
  104. echo "图片不存在!";
  105. exit;
  106. }
  107. $file = $_FILES["upfile"];
  108. if($max_file_size < $file["size"])
  109. //检查文件大小
  110. {
  111. echo "文件太大!";
  112. exit;
  113. }
  114. if(!in_array($file["type"], $uptypes))
  115. //检查文件类型
  116. {
  117. echo "文件类型不符!".$file["type"];
  118. exit;
  119. }
  120. if(!file_exists($destination_folder))
  121. {
  122. mkdir($destination_folder);
  123. }
  124. $filename=$file["tmp_name"];
  125. $image_size = getimagesize($filename);
  126. $pinfo=pathinfo($file["name"]);
  127. $ftype=$pinfo['extension'];
  128. $destination = $destination_folder.time().".".$ftype;
  129. if (file_exists($destination) && $overwrite != true)
  130. {
  131. echo "同名文件已经存在了";
  132. exit;
  133. }
  134. if(!move_uploaded_file ($filename, $destination))
  135. {
  136. echo "移动文件出错";
  137. exit;
  138. }
  139. $pinfo=pathinfo($destination);
  140. $fname=$pinfo[basename];
  141. echo " <font color=red>已经成功上传</font><br>文件名: <font color=blue>".$destination_folder.$fname."</font><br>";
  142. echo " 宽度:".$image_size[0];
  143. echo " 长度:".$image_size[1];
  144. echo "<br> 大小:".$file["size"]." bytes";
  145. if($watermark==1)
  146. {
  147. $iinfo=getimagesize($destination,$iinfo);
  148. $nimage=imagecreatetruecolor($image_size[0],$image_size[1]);
  149. $white=imagecolorallocate($nimage,255,255,255);
  150. $black=imagecolorallocate($nimage,0,0,0);
  151. $red=imagecolorallocate($nimage,255,0,0);
  152. imagefill($nimage,0,0,$white);
  153. switch ($iinfo[2])
  154. {
  155. case 1:
  156. $simage =imagecreatefromgif($destination);
  157. break;
  158. case 2:
  159. $simage =imagecreatefromjpeg($destination);
  160. break;
  161. case 3:
  162. $simage =imagecreatefrompng($destination);
  163. break;
  164. case 6:
  165. $simage =imagecreatefromwbmp($destination);
  166. break;
  167. default:
  168. die("不支持的文件类型");
  169. exit;
  170. }
  171. imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);
  172. imagefilledrectangle($nimage,1,$image_size[1]-15,80,$image_size[1],$white);
  173. switch($watertype)
  174. {
  175. case 1: //加水印字符串
  176. imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);
  177. break;
  178. case 2: //加水印图片
  179. $simage1 =imagecreatefromgif("xplore.gif");
  180. imagecopy($nimage,$simage1,0,0,0,0,85,15);
  181. imagedestroy($simage1);
  182. break;
  183. }
  184. switch ($iinfo[2])
  185. {
  186. case 1:
  187. //imagegif($nimage, $destination);
  188. imagejpeg($nimage, $destination);
  189. break;
  190. case 2:
  191. imagejpeg($nimage, $destination);
  192. break;
  193. case 3:
  194. imagepng($nimage, $destination);
  195. break;
  196. case 6:
  197. imagewbmp($nimage, $destination);
  198. //imagejpeg($nimage, $destination);
  199. break;
  200. }
  201. //覆盖原上传文件
  202. imagedestroy($nimage);
  203. imagedestroy($simage);
  204. }
  205. if($imgpreview==1)
  206. {
  207. echo "<br>图片预览:<br>";
  208. echo "<img src="".$destination."" width=".($image_size[0]*$imgpreviewsize)." height=".($image_size[1]*$imgpreviewsize);
  209. echo " alt="图片预览:r文件名:".$destination."r上传时间:">";
  210. }
  211. }
  212. ?>
  213. </body>
  214. </html>