当前文章: 首页 >> 编程开发 >> PHP >> PHP上传文件代码与问题总结
«    2021年7月    »
1234
567891011
12131415161718
19202122232425
262728293031
网站分类
访客信息
    标签列表
    最近发表
    友站访问排行

      PHP上传文件代码与问题总结

      客户端HTML代码:

      <html>
      <body>
       
      <form action="upload_file.php" method="post"
      enctype="multipart/form-data">
      <label for="file">Filename:</label>
      <input type="file" name="file" id="file" /> 
      <br />
      <input type="submit" name="submit" value="Submit" />
      </form>
       
      </body>
      </html>


      服务端PHP代码:

      php上传文件默认上传到临时目录下,路径为 $_FILES[“file”][“tmp_name”],需要使用move_uploaded_file函数移动最终的目标目录,不然当会话结束后会被php自动删除。

      <?php
      if ((($_FILES["file"]["type"] == "image/gif")
      || ($_FILES["file"]["type"] == "image/jpeg")
      || ($_FILES["file"]["type"] == "image/pjpeg"))
      && ($_FILES["file"]["size"] < 20000))
        {
        if ($_FILES["file"]["error"] > 0)
          {
          echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
          }
        else
          {
          echo "Upload: " . $_FILES["file"]["name"] . "<br />";
          echo "Type: " . $_FILES["file"]["type"] . "<br />";
          echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
          echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
       
          if (file_exists("upload/" . $_FILES["file"]["name"]))
            {
            echo $_FILES["file"]["name"] . " already exists. ";
            }
          else
            {
            move_uploaded_file($_FILES["file"]["tmp_name"],
            "upload/" . $_FILES["file"]["name"]);
            echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
            }
          }
        }
      else
        {
        echo "Invalid file";
        }
      ?>

      例如:

      20171120093613.jpg


      如果需要限制文件上传类型可通过判断 type 文件类型;限制文件上传大小可通过判断size ,需要获取文件后缀可在name中截取。

      在php判断文件大小时其实文件已经上传结束,需要在上传前限制大小,请在php.ini中配置。

      max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
      max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
      memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M
      把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了
      max_execution_time = 600
      max_input_time = 600
      memory_limit = 32m
      file_uploads = on
      upload_tmp_dir = /tmp
      upload_max_filesize = 32m
      post_max_size = 32m

      Nginx上传大小限制: 解决nginx上传文件413 Request Entity Too Large错误问题



      常见问题:

      找不到上传文件:

      在使用phpstore调试断点时(断点时会话并没结束,删除还没有自动删除)明明看到上传成功在/tmp/php5ffonS,但在终端就是看不到该文件。

      原因是因为是systemd启用了PrivateTmp=true

      如CentOS7:

      文件: /etc/systemd/system/multi-user.target.wants/php-fpm.service

      [Unit]
      Description=The PHP FastCGI Process Manager
      After=syslog.target network.target
       
      [Service]
      Type=notify
      PIDFile=/run/php-fpm/php-fpm.pid
      EnvironmentFile=/etc/sysconfig/php-fpm
      ExecStart=/usr/sbin/php-fpm --nodaemonize
      ExecReload=/bin/kill -USR2 $MAINPID
      PrivateTmp=true
       
      [Install]
      WantedBy=multi-user.target


      所以:

      /tmp 会映射到类似 /systemd-private-463736e6f1584785b2e2bcc6cf3c5151-php-fpm.service-LZsQEs/tmp 的文件中,而且是root权限。

      然而由于权限问题,会导致php的move_uploaded_file文件操作失败!


      方法1:

      PrivateTmp=false

      然后重启服务。


      方法2:

      由于CentOS默认启用selinux。

      # 首先把上传的目录设置为apache权限
      chown -R apache /var/www/mysite1/upload
      chmod -R 755 /var/www/mysite1/upload
       
      # 然后配置SElinx
      sudo chcon -t httpd_sys_rw_content_t /var/www/mysite1/upload -R


      声明:本站原创文章,转载、复制、使用等请注明出处。
      标题PHP上传文件代码与问题总结
      作者jues
      地址: http://blog.jues.org.cn/post/php-shang-chuan-wen-jian-dai-ma-yu-wen-ti-zong-jie.html

      发表评论:

      Powered By Z-BlogPHP 1.7.0 Powered By Z-BlogPHP © 2018 jues博客 Copyright Your WebSite.Some Rights Reserved.联系站长 Themes by jues