【问题标题】:Why is my PHP file upload code not working?为什么我的 PHP 文件上传代码不起作用?
【发布时间】:2016-02-24 08:01:22
【问题描述】:

我正在尝试使用 PHP 制作一个简单的文件上传表单。这是我的代码:

<?php
    $uploads_dir = '/uploads';

    if(isset($_FILES['thefile'])){
      $errors= array();
      $file_name = $_FILES['thefile']['name'];
      $file_size =$_FILES['thefile']['size'];
      $file_tmp =$_FILES['thefile']['tmp_name'];
      $file_type=$_FILES['thefile']['type'];
      $tmp_name = $_FILES['thefile']["tmp_name"];

      if($file_size > 2097152){
         $errors[]='File size must be less than 2 MB';
      }
      if(empty($errors)==true){
         move_uploaded_file($tmp_name, "$uploads_dir/$file_name");
         echo "Success";
      }
      else{
         print_r($errors);
      }
   }
?>
<!DOCTYPE html>
<html>
<head>
    <title>Simple File Upload</title>
</head>
<body>

<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="thefile" />
    <input type="submit"/>
</form>

</body>
</html>

我意识到我并没有限制文件类型,但是一旦我可以上传简单的 .jpg 或 .zip 文件,我会担心这一点。使用上面的代码,我转到位于

的本地服务器上的页面
C:\wamp\www\simpleupload  (this contains index.php, the file posted above)

当我选择一个小图像文件并单击提交时,我会看到以下错误:

警告:move_uploaded_file(/uploads/session_timeout_formatting_bug.png):无法打开流:第 18 行的 C:\wamp\www\project_fileshare\index.php 中没有这样的文件或目录

警告:move_uploaded_file(): Unable to move 'C:\wamp\tmp\phpEFDE.tmp' to '/uploads/session_timeout_formatting_bug.png' in C:\wamp\www\project_fileshare\index.php on line 18

第 18 行是调用 move_uploaded_file() 函数的行。

如何解决此错误?我有一个“uploads_dir”文件夹,位于与我的 index.php 文件相同的文件夹中。 (参考上面的文件路径)。我在这里做错了什么?我一定是误解了这个过程的一小部分,把我的目录放在了错误的地方,或者我在代码中做错了什么。

有人能发现我的错误并告诉我需要做什么来解决它吗?

【问题讨论】:

  • 尝试完整的系统路径/var/usr/public/uploads 或相对路径../uploads。另外请确保如果该文件夹确实存在,则具有适当的写入权限。
  • 仅供参考,第一个 if 语句在那里没有做任何事情,您不会以这种方式验证文件。 google for is_upload_ok.. 类似的东西...我不记得了,但我知道那条线在那里没有做任何事情
  • 并且还从 DIR__ 中获取根目录,这将很容易找到文件的根目录

标签: php html forms file file-upload


【解决方案1】:

您正在 Windows 上工作,并且您告诉 PHP 一个无法访问的位置(即/uploads linux 路径)。

因为您在 Windows 中工作并且您的文档根目录是 C:\wamp\www\simpleupload

也就是说,您的文件的位置如下:

  • C:\wamp\www\simpleupload\index.php(你的上传脚本)
  • C:\wamp\www\simpleupload\uploads(上传文件的地方)

为什么不使用这样的绝对路径:

$uploads_dir = getcwd() . DIRECTORY_SEPARATOR . 'uploads';

getcwd() 函数将返回执行 PHP 脚本的当前工作目录(在您的情况下为 index.php),因此 $uploads_dir 现在看起来像这样:C:\wamp\www\simpleupload\uploads

试试这个。

【讨论】:

  • 我回家后试一试!
  • @jros 看看我的回答,我并不是说这会解决你的问题,但它对你的代码来说是重要的一步 =)
【解决方案2】:

如果您的上传目录与 index.php 位于同一位置,请删除 $uploads_dir 变量中的“/”。这个,还是加个“。”在斜杠之前,因为现在它指的是根目录,这可能是您当前工作目录的其他内容。说到魔鬼; http://php.net/manual/en/function.getcwd.php

$uploads_dir = getcwd() . '\uploads';
$uploads_dir = __DIR__ . '\uploads'; #php > 5.6

另外,检查您的目录是否可写为 php: http://php.net/manual/en/function.is-writable.php

Latheesan 也说过,最好跨平台,因为我在编辑中犯了同样的错误。

<?php
    function buildPath(...$segments){
        return join(DIRECTORY_SEPARATOR, $segments);
    }

    echo buildPath(__DIR__, 'uploads');
?>

【讨论】:

    【解决方案3】:

    我会改变

    if(isset($_FILES['thefile'])){
    

    为此

    if($_FILE['thefile']['error'] === UPLOAD_ERR_OK){
    

    因为我认为这是了解用户是上传文件还是输入为空白的最佳方式。

    或者

    if (isset($_FILE["thefile"]["name"])){
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2014-01-23
      • 2013-08-06
      相关资源
      最近更新 更多