博客列表 >【PHP文件操作】文件目录操作基本操作及文件的上传和下载

【PHP文件操作】文件目录操作基本操作及文件的上传和下载

 一纸荒凉* Armani
 一纸荒凉* Armani原创
2021年05月15日 20:24:361313浏览

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数据给后端然后返回该数据块对应的地址。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议