Blogger Information
Blog 128
fans 9
comment 5
visits 241312
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
【PHP文件操作】文件目录操作基本操作及文件的上传和下载
 一纸荒凉* Armani
Original
1314 people have browsed it

PHP文件目录操作

1、简单写文件:

  1. // 写数据到指定文件中
  2. file_put_contents("文件名","数据字符串");

2、简单读文件:

  1. // 从指定文件中读取内容
  2. $file=file_get_contents(“文件名”);
  3. // 获取某个网页源码到文件中
  4. file_put_contents("index.html",file_get_contents("http://php.cn/"));

3、读文件并输出:

  1. readfile("ww.txt"); // 也可传递URL,内容自接输出无需加echo等

4、读文件以行为单位存入数组:

  1. $arr=file("文件名");
  2. echo $arr[0]; // 第一行内容echo
  3. $arr[1]; // 第二行内容

5、取目录名:

  1. dirname($文件路径字符串) // 返回目录字符串

6、获取文件名:

  1. basename("字符串"); // 获取文件名

7、创建目录:

  1. // 创建的目录必须是一个不存在的,存在会出现错误 //第二个参数如:0777
  2. mkdir(“目录名字符串“);

8、删除空目录:

  1. rmdir("空目录名"); // 返回bool

9、创建文件:

  1. touch("文件名"); // 返回bool

10、删除文件:

  1. unlink("文件名或文件名路径");

11、检查文件或目录是否存在:

  1. file_exists(“文件字符串”); // 返回bool

12、基本判断(内容必须存在):判断是否是目录【is_dir(“字符串”)】、 判断是否是文件【is_file(“字符串”)】

13、获取文件修改时间:filemtime(“文件字符串”);//返回时间戳

14、获取文件大小:filesize(“文件字符串”);//返回字节数

15、文件重命名和移动:rename(“原文件”,”新文件”);//返回bool

16、文件复制:copy(“原文件”,”新文件”);//返回bool

17、文件权限:【is_readable()】、【is_writable()】【is_executable()】//读 写 执行

18、目录分隔符:DIRECTORY_SEPARATOR; // 在liux系统为“/”,在win下为“\”

19、换行符:PHP_EOL // 在liux系统为“\n”,在win下位“\r\n”

20、获取磁盘总大小:echo disk_total_space(“C:”);//返回字节数

21、获取磁盘可用空间总大小:echo disk_free_space(“C:”);//返回字节数

​ echo “C磁盘总大小:”.round(disk_total_space(“C:”)/pow(2,30),2).”G”;//打印以G为单位大小

22、目录:当前目录(点加斜杠)【 . / 】,上级目录(点点加斜杠)【 . . /

23、打印目录下文件:

  1. print_r(glob("./admin/config/*php")); // 获取文件夹admin/config下的php文件,无到子目录,只返回当前目录下

24、遍历文件夹:

  1. $dir=opendir("./dirdong");//打开文件资源
  2. while($fi=readdir($dir)){//循环
  3. if(is_dir("./dirdong/".$fi)) echo "目录:".$fi."<br/>";
  4. if(is_file("./dirdong/".$fi)) echo "文件:".$fi."<br/>";
  5. }
  6. closedir($dir);//关闭文件资源

25、利用文件指针的方式读写文件:

  1. /*打开模式:
  2. r 只读方式,文件指针处于开始
  3. r+ 读写方式,文件指针处于开始,文件无报错
  4. w 只写方式,文件指针处于开始
  5. w+ 读写方式,文件指针处于开始,文件无则创建
  6. a 写追加方式,文件指针处于末尾,文件无则创建
  7. a+ 读写方式,文件指针处于末尾,文件无则创建
  8. rb wb 二进制读写方式
  9. rt wt 文本方式读写方式
  10. */
  11. $f=fopen("ww.txt","r+");//打开文件 ww.txt 资源
  12. fseek($f,3);//从前往后移动文件指针3个字节
  13. fseek($f,-2,SEEK_END);//从后往前移动文件指针2个字节
  14. rewind($f);//将指针数组移动至开头
  15. echo ftell($f);//查看文件指针位置
  16. //循环读取文件内容
  17. //while(!feof($f)){//判断文件结尾
  18. //echo fgetc($f);//只读取一个字节
  19. //}
  20. //echo fgets($f);//一次读一行
  21. //echo fread($f,2);//读取两个字节
  22. //fwrite($f,"32w东小东\nxxx");//写内容
  23. fclose($f);//关闭文件资源

26、文件锁,防止同时操作文件造成数据絮乱:

  1. flock($f,LOCK_EX);//设置写锁,返回bool
  2. flock($f,LOCK_SH);//设置读锁,返回bool
  3. //文件读写操作
  4. flock($f,LOCK_UN);//释放锁,返回bool

27、文件上传到服务器:

HTML:

  1. <form action="wan.php" method="post" enctype="multipart/form-data">
  2. <input type="text" name="namexx">
  3. <br>
  4. <input type="file" name="filexx">
  5. <br/>
  6. <input type="submit" value="东小东上传">
  7. </form>

PHP:

  1. //error_reporting("E_ALL & ~ E_NOTICE");
  2. //post数据,无文件数据
  3. print_r($_POST);
  4. //文件数据 名字,类型,零时目录,大小等
  5. print_r($_FILES["filexx"]);
  6. //设置保存地址
  7. $filepath="img/".$_POST["namexx"];
  8. //拷贝零时文件到保存目录
  9. if(move_uploaded_file($_FILES["filexx"]["tmp_name"],$filepath)){
  10. echo "上传成功";
  11. }else{
  12. echo "上传失败";
  13. }

文件上传错误值:

28、多文件上传基本思路:利用文件数组

  1. <input type="file" name="filexx[]" multiple>

29、文件下载:通过返回头告诉客户端此为附件即可

  1. //告诉浏览器此文件为附件(可下载,不用浏览器解析)
  2. header("Content-Disposition:attachment;filename=任意文件名1");
  3. //输出内容
  4. readfile("任意文件名1");

PHP文件上传

文件上传是 PHP 文件系统的重要功能之一,要使用文件上传功能,我们首先需要在配置文件 php.ini 中对上传做一些设置;然后通过预定义变量 $_FILES 对上传文件做一些限制和判断;最后使用 move_uploaded_file() 函数来实现上传。

1. 文件上传的配置

实现文件上传功能,首先要在 php.ini 中开启文件上传,并对其中的一些参数作出合理的设置。找到 Uploads 项,可以看到下面 3 个属性值,其含义如下:

  • file_uploads:如果值是 on,则说明服务器开启了文件上传功能:如果为 off,则说明服务器关闭了文件上传功能;
  • upload_tmp_dir:上传文件的临时目录。在文件被成功上传之前,文件首先会存放到服务器端的临时目录中,不设置的为系统默认的目录;
  • upload_max_filesize:服务器允许上传文件的最大值,以MB为单位,系统默认为2MB,用可以自行设置。

除了 File Uploads 项,还有几个属性也会影响到上传文件的功能:

  • max_execution_time:PHP 中一个指令所能执行的最大时间,单位是秒;
  • memory_limit:PHP 中一个指令所分配的内存空间,单位是 MB。

一般情况下将 php.ini 配置称下面的样子即可,当然也可以根据自己的需求做相应的调整。

  1. ; Whether to allow HTTP file uploads.
  2. ; http://php.net/file-uploads
  3. file_uploads = On
  4. ; Temporary directory for HTTP uploaded files (will use system default if not
  5. ; specified).
  6. ; http://php.net/upload-tmp-dir
  7. ;upload_tmp_dir =
  8. ; Maximum allowed size for uploaded files.
  9. ; http://php.net/upload-max-filesize
  10. upload_max_filesize = 100M
  11. ; Maximum number of files that can be uploaded via a single request
  12. max_file_uploads = 100
  13. ; Maximum amount of memory a script may consume (128MB)
  14. ; http://php.net/memory-limit
  15. memory_limit=256M
  16. ; Maximum execution time of each script, in seconds
  17. ; http://php.net/max-execution-time
  18. ; Note: This directive is hardcoded to 0 for the CLI SAPI
  19. max_execution_time = 300

文件上传项目项在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 允许的尽可能最大的文件上传

2. 预定义变量$_FILE

$_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. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>PHP文件上传</title>
  6. </head>
  7. <body>
  8. <form action="" method="post" enctype="multipart/form-data">
  9. <input type="file" name="upfile">
  10. <input type="submit" value="上传">
  11. </form>
  12. </body>
  13. </html>
  14. <?php
  15. if(!empty($_FILES)){
  16. // $_FILES["file"]["error"] 由文件上传导致的错误代码
  17. if ($_FILES["upfile"]["error"] > 0)
  18. {
  19. echo "Error: " . $_FILES["upfile"]["error"] . "<br />";
  20. }
  21. else
  22. {
  23. // 被上传文件的名称
  24. echo "Upload: " . $_FILES["upfile"]["name"] . "<br />";
  25. // 被上传文件的类型
  26. echo "Type: " . $_FILES["upfile"]["type"] . "<br />";
  27. // 被上传文件的大小,字节 byte
  28. echo "Size: " . ($_FILES["upfile"]["size"] / 1024) . " Kb<br />";
  29. // 存储在服务器的文件的临时副本的名称
  30. echo "Stored in: " . $_FILES["upfile"]["tmp_name"];
  31. }
  32. }
  33. ?>

3. 单文件上传

通过上面的代码我们已经可以获取到上传文件的信息了,通过这些信息再联合 move_uploaded_file() 函数就可以实现文件上传。move_uploaded_file() 函数的主要功能就是将上传的文件移动到新的位置,执行成功时返回 TRUE,否则返回 FALSE

move_uploaded_file(string $filename, string $destination)

其中,$filename 为上传文件的文件名;$destination 为文件要移动到的位置。

注意:$filename 接受的是文件上传后的临时名称而不是文件的原名称,它可以通过 $_FILES["upfile"]["tmp_name"] 得到

文件上传一般有下面2种方式:

1、标准input表单方式,典型的用$_FILES进行接收;
2、以Base64的方式进行传送,一般是AJAX异步上传。

  • <form>标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data”。
  • <input>标签的 type=”file” 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
  • action=""表示当前页面提交,method=”post”传输方式为post

前端表单上传文件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>PHP文件上传</title>
  6. </head>
  7. <body>
  8. <form action="./upload_file.php" method="post" enctype="multipart/form-data">
  9. <fieldset>
  10. <legend>单文件上传</legend>
  11. <input type="file" name="file">
  12. <input type="submit" value="上传">
  13. </fieldset>
  14. </form>
  15. </body>
  16. </html>

后端文件上传限制

  1. <?php
  2. /**
  3. * 文件上传 :客户端上传文件到服务器, 首先存在临时文件夹下, 做一些严格的验证(大小, 后缀,合法文件,),通过以后,移动文件到指定的文件夹
  4. */
  5. // 在php文件开头调用以下函数 ini_set()设置php配置文件的单个属性
  6. //报告所有错误
  7. error_reporting(E_ALL);
  8. // 接收错误信息但不打印
  9. ini_set("display_errors", "Off");
  10. // 开启错误日志
  11. ini_set("log_errors", "On");
  12. // 设置错误日志文件路径
  13. ini_set("error_log", "./error.log");
  14. if(!empty($_FILES)){
  15. printf('<pre>%s</pre>',print_r($_FILES,true));
  16. // 允许上传的图片后缀
  17. $allowExts = ['jpg','jpeg','pjpeg','png','wbmp','gif'];
  18. $temp = explode(".", $_FILES["file"]["name"]);
  19. // 获取文件后缀名
  20. $extension = array_pop($temp);
  21. if ((($_FILES["file"]["type"] == "image/gif")
  22. || ($_FILES["file"]["type"] == "image/jpeg")
  23. || ($_FILES["file"]["type"] == "image/pjpeg")
  24. || ($_FILES["file"]["type"] == "image/png")
  25. || ($_FILES["file"]["type"] == "image/wbmp"))
  26. && in_array($extension, $allowExts)){
  27. if ($_FILES["file"]["error"] > 0)
  28. {
  29. switch($_FILES["file"]["error"]) :
  30. case 1:
  31. echo '文件超过`php.ini`中`upload_max_filesize`值<br>';
  32. break;
  33. case 2:
  34. echo '文件大小超过表单中`MAX_FILE_SIZE`指定的值<br>';
  35. break;
  36. case 3:
  37. echo '文件只有部分被上传<br>';
  38. break;
  39. case 4:
  40. echo '没有文件被上传<br>';
  41. break;
  42. case 6:
  43. echo '找不到临时文件夹<br>';
  44. break;
  45. case 6:
  46. echo '文件写入失败<br>';
  47. break;
  48. default:
  49. echo 'Error: 系统错误<br>';
  50. break;
  51. endswitch;
  52. }else{
  53. $maxSize = '2MB';
  54. // 检查文件上传大小 需小于2MB
  55. if($_FILES["file"]["size"] > intval($maxSize)*1024*1024){
  56. die("图片超大,请上传小于5MB的图片!");
  57. }
  58. // 检测图片是否合法
  59. if(!getimagesize($_FILES['file']['tmp_name'])){
  60. die("不是真实图片内容,get out~");
  61. }
  62. // 检测图片是否通过http post方式上传
  63. if(!is_uploaded_file($_FILES['file']['tmp_name'])){
  64. die("上传方式错误:请使用http post方式上传");
  65. }
  66. // 检测uploads文件夹是否存在
  67. $destination = "uploads/";
  68. // 如果没有 uploads 目录,你需要创建它,uploads 目录权限为 777
  69. if(!file_exists($destination))
  70. {
  71. // 不存在则创建uploads文件夹
  72. mkdir($destination,0777,true);
  73. chmod($destination,0777);
  74. }
  75. // 判断当前目录下的 uploads 目录是否存在该文件
  76. if (file_exists($destination . $_FILES["file"]["name"]))
  77. {
  78. echo $_FILES["file"]["name"] . " already exists. ";
  79. }else{
  80. $tmpname = $_FILES['file']['tmp_name']; // 临时文件名称
  81. $name = $_FILES['file']['name']; // 文件的原名称
  82. $path = './uploads'; // 上传目录
  83. $file_name = date('YmdHis').rand(100,999).$name;// 避免文件重名,更改文件名称
  84. // 检测是否上传成功
  85. if(move_uploaded_file($tmpname, $path.'/'.$file_name)){
  86. echo $name." 上传成功!<br>";
  87. echo "<img src='./$path/$file_name' width='100'>";
  88. }else{
  89. echo $name." 上传失败!";
  90. }
  91. }
  92. }
  93. }else {
  94. echo "非法的文件格式 Invalid file";
  95. }
  96. }
  97. ?>

4. 多文件上传

前面我们成功上传了一个文件,但有些时候我们往往需要一次上传多个文件。例如上传相片到博客就需要多个文件同时上传。实现多文件上传也非常简单

在使用 input 上传图片的时候,为了避免用户选择非图片的文件,于是就在 input 标签里面加入了 accept=image/*" 来规定能够上传的文件类型。

multiple支持一次选多个文件,pic[]以数组的形式接收多个文件。手机端端还可以加入参数capture=”camera”选择摄像头拍照上传。

使用multipart属性可以支持多文件上传,允许选中多个文件。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>PHP多文件上传</title>
  6. </head>
  7. <body>
  8. <form action="" method="post" enctype="multipart/form-data">
  9. <input type="file" name="pic[]" multiple capture accept="image/*" >
  10. <input type="submit" value="上传">
  11. </form>
  12. </body>
  13. </html>
  14. <?php
  15. if(!empty($_FILES)){
  16. $tmpname = $_FILES['pic']['tmp_name'];
  17. $name = $_FILES['pic']['name'];
  18. $path = './uploads';
  19. for ($i=0; $i < count($tmpname); $i++) {
  20. $file_name = date('YmdHis').rand(100,999).$name[$i];
  21. if(move_uploaded_file($tmpname[$i], $path.'/'.$file_name)){
  22. echo $name[$i].' 上传成功!<br>';
  23. }else{
  24. echo $name[$i].' 上传失败!<br>';
  25. }
  26. }
  27. }
  28. ?>

$_FILES数据格式

  1. array(1) {
  2. ["pic"] => array(5) {
  3. ["name"] => array(2) {
  4. [0] => string(5) "1.jpg"
  5. [1] => string(5) "2.jpg"
  6. }
  7. ["type"] => array(2) {
  8. [0] => string(10) "image/jpeg"
  9. [1] => string(10) "image/jpeg"
  10. }
  11. ["tmp_name"] => array(2) {
  12. [0] => string(27) "C:\Windows\Temp\php7A7E.tmp"
  13. [1] => string(27) "C:\Windows\Temp\php7A7F.tmp"
  14. }
  15. ["error"] => array(2) {
  16. [0] => int(0)
  17. [1] => int(0)
  18. }
  19. ["size"] => array(2) {
  20. [0] => int(77357)
  21. [1] => int(56720)
  22. }
  23. }
  24. }

不使用multipart属性,设置表单不同的name:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>PHP多文件上传</title>
  6. </head>
  7. <body>
  8. <form action="" method="post" enctype="multipart/form-data">
  9. <input type="file" name="id_pic_1" accept="image/*" /><br>
  10. <input type="file" name="id_pic_2" accept="image/*" /><br>
  11. <input type="file" name="id_pic_3" accept="image/*" /><br>
  12. <input type="submit" value="上传">
  13. </form>
  14. </body>
  15. </html>
  16. <?php
  17. if(!empty($_FILES)){
  18. foreach($_FILES as $k=>$v){
  19. $tmpname = $v['tmp_name'];
  20. $name = $v['name'];
  21. $path = './uploads';
  22. $file_name = date('YmdHis').rand(100,999).$name;
  23. if(move_uploaded_file($tmpname, $path.'/'.$file_name)){
  24. echo $name.' 上传成功!<br>';
  25. }else{
  26. echo $name.' 上传失败!<br>';
  27. }
  28. }
  29. }
  30. ?>

$_FILES数据格式

  1. array(1) {
  2. ["id_pic_1"] => array(5) {
  3. ["name"] => string(5) "1.jpg"
  4. ["type"] => string(10) "image/jpeg"
  5. ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEE.tmp"
  6. ["error"] => int(0)
  7. ["size"] => int(77357)
  8. }
  9. ["id_pic_2"] => array(5) {
  10. ["name"] => string(5) "2.jpg"
  11. ["type"] => string(10) "image/jpeg"
  12. ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEF.tmp"
  13. ["error"] => int(0)
  14. ["size"] => int(56720)
  15. }
  16. ["id_pic_2"] => array(5) {
  17. ["name"] => string(5) "2.jpg"
  18. ["type"] => string(10) "image/jpeg"
  19. ["tmp_name"] => string(27) "C:\Windows\Temp\phpBBEF.tmp"
  20. ["error"] => int(0)
  21. ["size"] => int(56720)
  22. }
  23. }

5. 设置PHP错误提示

第一种修改配置文件php.ini,将前面;分号去掉开启对应的配置项

  1. # 错误级别
  2. ; error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT # 生产
  3. ; error_reporting = E_ALL | E_STRICT # 默认
  4. error_reporting = E_ALL # 开发
  1. # 是否显示错误信息
  2. # 开启状态下,若出现错误,则报错,出现错误提示
  3. ; display_errors = On
  4. # 关闭状态下,若出现错误,则提示:服务器错误。但是不会出现错误提示
  5. dispaly_errors = Off
  1. # 接收但不显示错误信息的时候,可以开启错误报告
  2. log_errors = On
  3. # 设置错误报告文件路径
  4. error_log="D:\UPUPW\Apache\logs\php_errors.log"

第二种单个脚本文件中设置

  1. // 在php文件开头调用以下函数 ini_set()设置php配置文件的单个属性
  2. //禁用错误报告
  3. // error_reporting(0);
  4. //报告运行时错误
  5. // error_reporting(E_ERROR | E_WARNING | E_PARSE);
  6. //报告所有错误
  7. error_reporting(E_ALL);
  8. // 接收错误信息但不打印
  9. ini_set("display_errors", "Off");
  10. // 开启错误日志
  11. ini_set("log_errors", "On");
  12. // 设置错误日志文件路径
  13. ini_set("error_log", "./error.log");
  14. // 输入一个未定义的变量
  15. echo $s;

这时候我们同级目录下就会生成一个error.log文件存放着错误信息

  1. [15-May-2021 15:48:51 Asia/Shanghai] PHP Notice: Undefined variable: s in E:\zhang\0514\upload_file.php on line 21

封装文件上传

目录结构为:

  1. test
  2. |-----upload # 文件上传的目录
  3. |-----form.html # 表单文件
  4. |-----upload_file.php # php 上传代码

根据需求封装文件上传限制函数:

  1. 文件大小不超过5M
  2. 后缀只能是[‘jpg’,’jpeg’,’png’,’wbmp’,’gif’]
  3. 检查图片合法性
  4. 为每一张图片处理散列名称
  5. 目标目录不存在,创建目录
  6. 设置错误日志接收系统错误
  1. <?php
  2. /*
  3. 封装文件上传函数
  4. */
  5. function uploadFile(array $fileInfo,$uploadPath="./uploads/",$flag = true,array $allowExts=['jpg','jpeg','png','wbmp','gif'],$maxSize="5MB"){
  6. if(!empty($fileInfo)){
  7. if ($fileInfo['error']>0) {
  8. switch($fileInfo['error']) :
  9. case 1:
  10. $res['mess'] = '文件超过`php.ini`中`upload_max_filesize`值<br>';
  11. break;
  12. case 2:
  13. $res['mess'] = '文件大小超过表单中`MAX_FILE_SIZE`指定的值<br>';
  14. break;
  15. case 3:
  16. $res['mess'] = '文件只有部分被上传<br>';
  17. break;
  18. case 4:
  19. $res['mess'] = '没有文件被上传<br>';
  20. break;
  21. case 6:
  22. $res['mess'] = '找不到临时文件夹<br>';
  23. break;
  24. case 6:
  25. $res['mess'] = '文件写入失败<br>';
  26. break;
  27. default:
  28. $res['mess'] = 'Error: 系统错误<br>';
  29. break;
  30. endswitch;
  31. return $res['mess'];
  32. }else{
  33. // 按照指定字符拆分为数组
  34. $temp = explode(".",$fileInfo["name"]);
  35. // 获取文件后缀名
  36. $extension = array_pop($temp);
  37. if(!in_array($extension, $allowExts)){
  38. $res['mess'] = ("该文件格式占不支持!");
  39. }
  40. $maxSize = '2MB';
  41. // 检查文件上传大小 需小于2MB
  42. if($fileInfo["size"] > intval($maxSize)*1024*1024){
  43. $res['mess'] = ("图片超大,请上传小于{$maxSize}的图片!");
  44. }
  45. if($flag){
  46. // 检测图片是否合法
  47. if(!getimagesize($fileInfo['tmp_name'])){
  48. $res['mess'] = ("不是真实图片内容,get out~");
  49. }
  50. }
  51. // 检测图片是否通过http post方式上传
  52. if(!is_uploaded_file($fileInfo['tmp_name'])){
  53. $res['mess'] = ("上传方式错误:请使用http post方式上传");
  54. }
  55. // 如果以上发生错误,就直接return结束返回错误内容
  56. if(!empty($res['mess'])){
  57. return $res['mess'];
  58. }
  59. // 检测uploads文件夹是否存在
  60. // 如果没有 uploads 目录,你需要创建它,uploads 目录权限为 777
  61. if(!file_exists($uploadPath))
  62. {
  63. // 不存在则创建uploads文件夹
  64. mkdir($uploadPath,0777,true);
  65. chmod($uploadPath,0777);
  66. }
  67. // 判断当前目录下的 uploads 目录是否存在该文件
  68. if (file_exists($uploadPath . $fileInfo["name"]))
  69. {
  70. echo $fileInfo["name"] . " already exists. ";
  71. }else{
  72. $tmpname = $fileInfo['tmp_name']; // 临时文件名称
  73. $name = $fileInfo['name']; // 文件的原名称
  74. $file_name = md5(date('YmdHis')).rand(100,999).'.'.$extension; // 避免文件重名,更改文件名称
  75. $fileRealPath = $uploadPath.$file_name;
  76. // 检测是否上传成功
  77. if(move_uploaded_file($tmpname, $fileRealPath)){
  78. $res['mess'] = $name."图片上传成功!";
  79. $res['imgurl'] = $fileRealPath;
  80. }else{
  81. $res['mess'] = $name."图片上传失败!请检查网络状况……";
  82. }
  83. return $res['mess'];
  84. }
  85. }
  86. }
  87. }
  88. ?>

利用form表单进行上传

  1. <?php
  2. //报告所有错误
  3. error_reporting(E_ALL);
  4. // 接收错误信息但不打印
  5. ini_set("display_errors", "Off");
  6. // 开启错误日志
  7. ini_set("log_errors", "On");
  8. // 设置错误日志文件路径
  9. ini_set("error_log", "./error.log");
  10. ?>
  11. <!DOCTYPE html>
  12. <html lang="en">
  13. <head>
  14. <meta charset="UTF-8">
  15. <title>PHP文件上传</title>
  16. </head>
  17. <body>
  18. <form action="" method="post" enctype="multipart/form-data">
  19. <fieldset>
  20. <legend>单文件上传</legend>
  21. <input type="file" name="file" accept="image/*">
  22. <input type="submit" value="上传">
  23. </fieldset>
  24. </form>
  25. </body>
  26. </html>
  27. <?php
  28. require "./common.php";
  29. /*
  30. uploadFile()函数参数分别为
  31. $_FILES['file'] array
  32. 文件存放文件夹 string
  33. 是否检测图片合法性 Boolean
  34. 支持的图片格式 array
  35. 图片最大格式'2MB' string
  36. */
  37. if(!empty($_FILES['file'])){
  38. $res = uploadFile($_FILES['file'],"./static/");
  39. echo $res['mess']."<br>";
  40. $url = $res['imgurl']??null;
  41. echo !empty($url)?"<img src='$url' width='100'>":'';
  42. }
  43. ?>

使用formData上传

  1. var formData = new FormData();
  2. formData.append("file", file); //file是blob数据
  3. //再用ajax发送formData到服务器即可,注意一定要是post方式上传

使用fileReader读取文件数据进行上传

  1. var fr = new FileReader();
  2. fr.readAsDataURL(file);
  3. fr.onload = function (event) {
  4. //此处获得的data是base64格式的数据
  5. var data= event.target.result;
  6. img.src = data;
  7. ajax(url,{data} ,function(){})
  8. }
  9. // data可以用来实现图片上传前的本地预览,也可以用来发送base64数据给后端然后返回该数据块对应的地址。
Correcting teacher:灭绝师太灭绝师太

Correction status:qualified

Teacher's comments:filesystem以及directory系列函数掌握以后, 对于文件目录的操作就会更灵活~
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post