博客列表 >0511文件上传

0511文件上传

扬美刘
扬美刘原创
2020年05月12日 17:58:19624浏览

1)单独上传一个图片文件

简单地上传一个文件,做简单的判断

  1. <?php
  2. // phpinfo();
  3. // 查看上传的值
  4. // printf('<pre>%s</pre>', print_r($_FILES, true));
  5. // 查看系统对文件大小的限制
  6. // echo '文件限制:'.ini_get('upload_max_filesize');
  7. // 取得文件的参数,把参数简化一点;
  8. $a=$_FILES['upfile'];
  9. // printf('<pre>%s</pre>', print_r($a, true));
  10. // 1)判断文件已上传
  11. if ($a['error'] !==0) echo '没有文件上传;';
  12. // 2)判断文件大小
  13. switch ($a['error']){
  14. case 1:
  15. echo '文件超过指定的大小:'.ini_get('upload_max_filesize');
  16. break;
  17. case 2:
  18. echo '文件超过表单要求的大小';
  19. break;
  20. default:
  21. // echo '文件符合要求的大小';
  22. }
  23. // 3)判断文件格式是图片
  24. if (strstr($a['type'],'/',true) !=='image') echo '文件不是图片;';
  25. // 4) 判断是不是post上来的;
  26. if (!is_uploaded_file($a['tmp_name'])) die('上传方式合法');
  27. // 5) 把临时文件移到目标文件夹中,并重新生成文件名称
  28. $targetfilename='../upload/'.md5(time().mt_rand(1,1000)).strstr($a['name'], '.');
  29. if (move_uploaded_file($a['tmp_name'],$targetfilename )) {
  30. // 6)预览一下图片
  31. echo '<p>'.$a['name'].' : 上传成功~~</p>';
  32. echo "<img src='{$targetfilename}' width='200'>";
  33. }
  34. ?>
  35. <!DOCTYPE html>
  36. <html lang="en">
  37. <head>
  38. <meta charset="UTF-8">
  39. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  40. <title>Document</title>
  41. </head>
  42. <body>
  43. <form action="" method="post" enctype="multipart/form-data">
  44. <fieldset>
  45. <legend>文件上传</legend>
  46. <input name="upfile" type="file">
  47. <button>上传</button>
  48. </fieldset>
  49. </form>
  50. </body>
  51. </html>

2) 自定义异常类的独个文件上传

在上面的基础上,加入自定义异常数判断,让代码更加完整

  1. <?php
  2. // $_FILES
  3. $a=$_FILES['upfile'];
  4. // printf('<pre>%s</pre>', print_r($a, true));
  5. // 自定义上传异常类
  6. class UploadException extends Exception
  7. {
  8. public function __toString()
  9. {
  10. return <<< UPLOAD
  11. <ul>文件上传出错信息:
  12. <li>代码:$this->code</li>
  13. <li>信息:$this->message</li>
  14. <li>文件:$this->file</li>
  15. <li>行号:$this->line</li>
  16. </ul>
  17. UPLOAD;
  18. }
  19. }
  20. try {
  21. // 上传出错的代码
  22. $errorCode = $a['error'];
  23. if ($errorCode > 0) {
  24. switch ($errorCode) {
  25. case 1:
  26. throw new UploadException('上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值', 1);
  27. break;
  28. case 2:
  29. throw new UploadException('上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值', 2);
  30. break;
  31. case 3:
  32. throw new UploadException('文件只有部分被上传', 3);
  33. break;
  34. case 4:
  35. throw new UploadException('没有文件被上传', 4);
  36. break;
  37. case 5:
  38. throw new UploadException('找不到临时文件夹', 6);
  39. break;
  40. case 7:
  41. throw new UploadException('文件写入失败', 7);
  42. break;
  43. default:
  44. throw new UploadException('未知类型错误', 8);
  45. }
  46. }
  47. else{
  48. // 判断文件类型
  49. if (strstr($a['type'], '/', true) !== 'image') {throw new UploadException('文件类型错误', 9);}
  50. // 判断是不是post上来的;
  51. if (!is_uploaded_file($a['tmp_name'])) {throw new UploadException('请从表单上提交', 10);}
  52. }
  53. }
  54. catch (UploadException $e) {
  55. echo $e;
  56. }
  57. // 如果没报错,就称动文件
  58. if (!$e)
  59. { // 将文件从临时目录 移动到用户自定义的目标目录中
  60. if (is_uploaded_file($a['tmp_name'])) {
  61. $destFileName = '../upload/'.md5(time().mt_rand(1, 1000)).strstr($a['name'], '.');
  62. // 移动文件到目标目录使用的函数
  63. if (move_uploaded_file($a['tmp_name'], $destFileName)) {
  64. echo "<p>{$a['name']}: 上传成功~~</p>";
  65. echo "<img src='{$destFileName}' width='200'>";
  66. }
  67. }
  68. }
  69. ?>
  70. <!DOCTYPE html>
  71. <html lang="en">
  72. <head>
  73. <meta charset="UTF-8">
  74. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  75. <title>Document</title>
  76. </head>
  77. <body>
  78. <form action="" method="post" enctype="multipart/form-data">
  79. <fieldset>
  80. <legend>文件上传</legend>
  81. <input name="upfile" type="file">
  82. <input type="hidden" name="MAX_FILE_SIZE" value="500000">
  83. <button>上传</button>
  84. </fieldset>
  85. </form>
  86. </body>
  87. </html>

3) 多个文件上传

  1. <?php
  2. // $_FILES
  3. $a=$_FILES['upfiles'];
  4. // printf('<pre>%s</pre>', print_r( $a, true));
  5. if ($a){
  6. foreach ($a['error'] as $key => $error) {
  7. // 只要判断 error === 0 ,即就是有上传的
  8. if ($error === 0) {
  9. // 目标文件名,重新命名
  10. if (is_uploaded_file($a['tmp_name'][$key])) {
  11. $destFileName = '../upload/'.md5(time().mt_rand(1, 1000)).strstr($a['name'][$key], '.');
  12. // 移动文件,如果是图片就移动,不是图片不移动
  13. if (strstr($a['type'][$key], '/', true) === 'image') {
  14. move_uploaded_file($a['tmp_name'][$key], $destFileName);
  15. echo "<div>图片{$a['name'][$key]}上传成功:<img src='{$destFileName}' width='50'></div>";
  16. } else {
  17. echo "<div>文件{$a['name'][$key]}不是图片,上传不成功</div>";
  18. }
  19. }
  20. }
  21. else
  22. {
  23. echo "<div>文件{$a['name'][$key]}上传不成功</div>";
  24. }
  25. }
  26. }
  27. ?>
  28. <!DOCTYPE html>
  29. <html lang="en">
  30. <head>
  31. <meta charset="UTF-8">
  32. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  33. <title>Document</title>
  34. </head>
  35. <body>
  36. <form action="" method="post" enctype="multipart/form-data">
  37. <fieldset>
  38. <legend>文件上传</legend>
  39. <input type="file" name="upfiles[]" multiple>
  40. <input type="hidden" name="MAX_FILE_SIZE" value="500000">
  41. <button>上传</button>
  42. </fieldset>
  43. </form>
  44. </body>
  45. </html>

4 总结

  • 1) 文件上传在form里,method要用post;要enctype=”multipart/form-data”;
  • 2) 如果是上传一个文件,input的type=file;如果要多个文件,name要是数组,且要设为multiple;
  • 3) 上传提交后,单个文件的得到的是二维数据,多个文件的,得到的是三维数组;可以简化成一维和二维数据;
  • 4) 上传文件是危险的动作,需要对文件进行多方面的判断,如格式、大小等;
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议