博客列表 >文件上传与常用函数

文件上传与常用函数

雪~人胖胖
雪~人胖胖原创
2020年05月15日 13:05:23979浏览

文件上传

1. 文件上传配置

文件上传项目项在php.ini中设置,常用的配置项有:

序号 配置项 默认值 描述
1 file_uploads On 使 PHP 支持文件上传
2 upload_tmp_dir /tmp 指示应该临时把上传的文件存储在什么位置
3 max_file_uploads 20 单次请求时允许上传的最大文件数量
4 max_execution_time 30 设置 PHP 最长执行时间(秒)
5 max_input_time 60 设置 PHP 通过 POST/GET/PUT 接收数据的时长(秒)
6 memory_limit 128M 系统分配给当前脚本执行可用的最大内存容量
7 post_max_size 8M 允许的 POST 数据的总大小(以字节为单位)
8 upload_max_filesize 32M 允许的尽可能最大的文件上传(以字节为单位)

$_FILES

  • 上传文件的描述信息,全部保存在系统全局变量$_FILES
  • $_FILES以二维数组形式保存: $_FILES['form_file_name']['key']
  • 'form_file_name': 对应着表单中<input type="file" name="my_pic">name属性值
  • 'key': 共有 5 个键名, 描述如下:
序号 键名 描述
1 name 文件在客户端的原始文件名(即存在用户电脑上的文件名)
2 type 文件的 MIME 类型, 由浏览器提供, PHP 并不检查它
3 tmp_name 文件被上传到服务器上之后,在临时目录中临时文件名
4 error 和该文件上传相关的错误代码
5 size 已上传文件的大小(单位为字节)
  • 文件上传错误信息描述
序号 常量 描述
1 UPLOAD_ERR_OK 0 没有错误发生,文件上传成功
2 UPLOAD_ERR_INI_SIZE 1 文件超过php.iniupload_max_filesize
3 UPLOAD_ERR_FORM_SIZE 2 文件大小超过表单中MAX_FILE_SIZE指定的值
4 UPLOAD_ERR_PARTIAL 3 文件只有部分被上传
5 UPLOAD_ERR_NO_FILE 4 没有文件被上传
6 UPLOAD_ERR_NO_TMP_DIR 6 找不到临时文件夹
7 UPLOAD_ERR_CANT_WRITE 7 文件写入失败
  • 支持文件上传的前端表单设置
序号 属性设置 描述
1 <form method="POST"> 请求类型必须是POST
2 <form enctype="multipart/form-data"> 设置表单提交数据的编码类型
3 <input type="file" name="uploads"> 设置表单控件类型与名称以支持上传
4 <input type="hidden" name="MAX_FILE_SIZE" value="..."> 设置隐藏域限制上传文件大小(可选)
  • [扩展] enctype属性说明

enctype: 设置表单数据,在发送到服务器之前的编码规则

序号 属性值 描述
1 application/x-www-form-urlencoded 默认值, 发送前进行编码,空格转+,非空字符转 16 进制
2 multipart/form-data 不对字符编码,以二进制发送,适合文件上传
3 text/plain 纯文本发送,仅对空格编码(转为+)

4. MIME 类型

4.1 概述

  • MIME: (Multipurpose Internet Mail Extensions)的简写,中文意思”多功能因特网邮件扩展”
  • MIME: 最初用来表示 Email 附件格式的字符串, 后来演变成为网络文档或应用程序的文档格式规范
  • MIME: 由一个媒体类型一个子类组成, 中间用斜线/分隔,例如text/css

4.2 类型

序号 类型 描述 示例
1 text 文本 text/plain,text/html,text/css,text/javascript
2 image 图像 1 image/jpeg,image/gif,image/png,image/bmp,image/ webp,
2 image 图像 2 image/x-icon, image/vnd.microsoft.icon
3 audio 音频 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
4 video 视频 video/mp4,video/mpeg,video/webm, video/ogg,video/x-msvideo
5 application 二进制 1 application/octet-stream, application/javascript, application/ecmascript
5 application 二进制 2 application/json,application/pkcs12, application/vnd.mspowerpoint
5 application 二进制 3 application/xhtml+xml, application/xml, application/pdf,application/x-gzip
  • 表中,以x-为前缀的是还没有成为国际标准的格式
  • 如果某个文档不在该列表中,会识别为: applicaton/octet-stream, 如.md文档, 尽管它是纯文本

    单文件上传

    1. <?php
    2. class UploadException extends Exception
    3. {
    4. public function __toString()
    5. {
    6. return '错误代码:'.$this->code.'错误信息:'.$this->message;
    7. }
    8. }
    9. try{
    10. $errorcode = $_FILES['my_pic']['error'];
    11. if ($errorcode > 0){
    12. switch ($errorcode) {
    13. case UPLOAD_ERR_INI_SIZE:
    14. throw new UploadException('文件超过`php.ini`中`upload_max_filesize`值',1);
    15. break;
    16. case UPLOAD_ERR_FORM_SIZE:
    17. throw new UploadException('文件大小超过表单中`MAX_FILE_SIZE`指定的值',2);
    18. break;
    19. case UPLOAD_ERR_PARTIAL:
    20. throw new UploadException('文件只有部分被上传',3);
    21. break;
    22. case UPLOAD_ERR_NO_FILE:
    23. throw new UploadException('没有文件被上传',4);
    24. break;
    25. case UPLOAD_ERR_NO_TMP_DIR:
    26. throw new UploadException('找不到临时文件夹',6);
    27. break;
    28. case UPLOAD_ERR_CANT_WRITE:
    29. throw new UploadException('文件写入失败',7);
    30. break;
    31. // default:
    32. // throw new UploadException('未知错误',8);
    33. // break;
    34. }
    35. }
    36. //检测文件类型
    37. $files_type = $_FILES['my_pic']['type'];
    38. if (strstr($files_type,'/',true) !== 'image'){
    39. throw new UploadException('文件类型错误',9);
    40. }else{
    41. //移动文件到指定目录
    42. //先判断文件是否是通过POST上传使用is_uploaded_file
    43. //临时文件名
    44. $tmpFileName = $_FILES['my_pic']['tmp_name'];
    45. //原始文件名
    46. $originalFileName = $_FILES['my_pic']['name'];
    47. $destFile ='uploads/'.sha1(mt_rand(10,500).time().$originalFileName);
    48. if(is_uploaded_file($tmpFileName)){
    49. if(move_uploaded_file($tmpFileName,$destFile)){
    50. echo "{$originalFileName}.文件上传成功";
    51. echo "<img src='{$destFile}' width='200'>";
    52. }
    53. }
    54. }
    55. }catch(UploadException $e){
    56. echo $e;
    57. }
    58. ?>

    html部分

    1. <form action="" method="POST" enctype="multipart/form-data">
    2. <fieldset>
    3. <legend>单文件上传</legend>
    4. <input type="file" name="my_pic">
    5. <button>上传</button>
    6. </fieldset>
    7. </form>

    多文件上传

  1. class UploadException extends Exception
  2. {
  3. public function __toString()
  4. {
  5. return '错误代码:'.$this->code.'错误信息:'.$this->message;
  6. }
  7. }
  8. try{
  9. foreach($_FILES as $file){
  10. $errorcode = $file['error'];
  11. if ($errorcode > 0){
  12. switch ($errorcode) {
  13. case UPLOAD_ERR_INI_SIZE:
  14. throw new UploadException('文件超过`php.ini`中`upload_max_filesize`值',1);
  15. break;
  16. case UPLOAD_ERR_FORM_SIZE:
  17. throw new UploadException('文件大小超过表单中`MAX_FILE_SIZE`指定的值',2);
  18. break;
  19. case UPLOAD_ERR_PARTIAL:
  20. throw new UploadException('文件只有部分被上传',3);
  21. break;
  22. case UPLOAD_ERR_NO_FILE:
  23. throw new UploadException('没有文件被上传',4);
  24. break;
  25. case UPLOAD_ERR_NO_TMP_DIR:
  26. throw new UploadException('找不到临时文件夹',6);
  27. break;
  28. case UPLOAD_ERR_CANT_WRITE:
  29. throw new UploadException('文件写入失败',7);
  30. break;
  31. // default:
  32. // throw new UploadException('未知错误',8);
  33. // break;
  34. }
  35. }
  36. //检测文件类型
  37. $files_type = $file['type'];
  38. if (strstr($files_type,'/',true) !== 'image'){
  39. throw new UploadException('文件类型错误',9);
  40. }else{
  41. //移动文件到指定目录
  42. //先判断文件是否是通过POST上传使用is_uploaded_file
  43. //临时文件名
  44. $tmpFileName = $file['tmp_name'];
  45. //原始文件名
  46. $originalFileName = $file['name'];
  47. $destFile ='uploads/'.sha1(mt_rand(10,500).time().$originalFileName);
  48. if(is_uploaded_file($tmpFileName)){
  49. if(move_uploaded_file($tmpFileName,$destFile)){
  50. echo "{$originalFileName}.文件上传成功";
  51. echo "<img src='{$destFile}' width='200'>";
  52. }
  53. }
  54. }
  55. }
  56. }catch(UploadException $e){
  57. echo $e;
  58. }
  59. //html部分
  60. <form action="" method="POST" enctype="multipart/form-data">
  61. <fieldset>
  62. <legend>多文件上传</legend>
  63. <input type="file" name="my_pic1">
  64. <input type="file" name="my_pic2">
  65. <input type="file" name="my_pic3">
  66. <button>上传</button>
  67. </fieldset>
  68. </form>

批量上传

  1. class UploadException extends Exception
  2. {
  3. public function __toString()
  4. {
  5. return '错误代码:'.$this->code.'错误信息:'.$this->message;
  6. }
  7. }
  8. try{
  9. if($_FILES['my_pic']){
  10. foreach($_FILES['my_pic']['error'] as $key=>$error){
  11. if ($error > 0){
  12. switch ($error) {
  13. case UPLOAD_ERR_INI_SIZE:
  14. throw new UploadException('文件超过`php.ini`中`upload_max_filesize`值',1);
  15. break;
  16. case UPLOAD_ERR_FORM_SIZE:
  17. throw new UploadException('文件大小超过表单中`MAX_FILE_SIZE`指定的值',2);
  18. break;
  19. case UPLOAD_ERR_PARTIAL:
  20. throw new UploadException('文件只有部分被上传',3);
  21. break;
  22. case UPLOAD_ERR_NO_FILE:
  23. throw new UploadException('没有文件被上传',4);
  24. break;
  25. case UPLOAD_ERR_NO_TMP_DIR:
  26. throw new UploadException('找不到临时文件夹',6);
  27. break;
  28. case UPLOAD_ERR_CANT_WRITE:
  29. throw new UploadException('文件写入失败',7);
  30. break;
  31. // default:
  32. // throw new UploadException('未知错误',8);
  33. // break;
  34. }
  35. }
  36. //检测文件类型
  37. $files_type = $_FILES['my_pic']['type'][$key];
  38. if (strstr($files_type,'/',true) !== 'image'){
  39. throw new UploadException('文件类型错误',9);
  40. }else{
  41. //移动文件到指定目录
  42. //先判断文件是否是通过POST上传使用is_uploaded_file
  43. //临时文件名
  44. $tmpFileName = $_FILES['my_pic']['tmp_name'][$key];
  45. //原始文件名
  46. $originalFileName = $_FILES['my_pic']['name'][$key];
  47. $destFile ='uploads/'.sha1(mt_rand(10,500).time().$originalFileName);
  48. if(is_uploaded_file($tmpFileName)){
  49. if(move_uploaded_file($tmpFileName,$destFile)){
  50. echo "{$originalFileName}.文件上传成功";
  51. echo "<img src='{$destFile}' width='200'>";
  52. }
  53. }
  54. }
  55. }
  56. }
  57. }catch(UploadException $e){
  58. echo $e;
  59. }
  60. //html部分
  61. <form action="" method="POST" enctype="multipart/form-data">
  62. <fieldset>
  63. <legend>批量上传</legend>
  64. <!-- multiple属性:批量上传 -->
  65. <input type="file" name="my_pic[]" multiple>
  66. <button>上传</button>
  67. </fieldset>
  68. </form>

总结

文本上传一定要记住$_FILES的5个键名name,tmp_name,type,size,error以及error的值代表的意思,移动文件的move_uploaded_file函数,判断文件是否是通过post上传的is_uploaded_file函数,以及上传的一系列检测。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议