【问题标题】:PHP upload file code works on Windows XAMPP but not on production Linux boxPHP 上传文件代码适用于 Windows XAMPP 但不适用于生产 Linux 机器
【发布时间】:2014-03-22 01:56:03
【问题描述】:

我正在使用这个 PHP 上传 CSV 文件:

$mimes = array('application/vnd.ms-excel','text/plain','text/csv','text/tsv');
if ( in_array($_FILES['file']['type'],$mimes)  && ($_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>";
            move_uploaded_file($_FILES["file"]["tmp_name"],
            "csv/" . $_FILES["file"]["name"]);
            echo "Stored in: " . "csv/" . $_FILES["file"]["name"];

        }
    }
    else
    {
        echo "Invalid file";
    }

它在我的开发 XAMPP 设置中完美运行。

当我在 Linux 机器上部署站点时,它的行为就像文件上传成功但它不在所需的文件夹或 tmp 文件夹中。

我的表格是:

<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>

我的浏览器从回声中返回:

Upload: rere.csv
Type: application/vnd.ms-excel
Size: 2.34375 kB
Temp file: /tmp/php5XXT5v
Stored in: csv/rere.csv

我有一个更熟悉 Linux 的朋友看这个,他写了一些上传脚本。我们无法找到解决方案。

有什么提示吗?

【问题讨论】:

  • 尝试 chmod 777 csv 目录
  • 好旧的 W3fools 上传脚本...享受让您的服务器被这些东西在您的系统上撕开的安全漏洞破坏。
  • 如果脚本没有返回“无效文件”,可能是权限问题。不要在生产环境中执行 777 chmod,但您必须确保目标文件夹是可写的并且可以使用 www-data(apache2 用户)执行。
  • 为什么不给move_uploaded_fileecho 分配一个变量呢...另外,不要相信那些安装了 linux 然后使用 GUI 寻求帮助的人。
  • @Ankit Pise chmod 777 csv 会起作用,但它会自找麻烦。

标签: php linux file-upload xampp


【解决方案1】:

如果脚本没有返回“无效文件”,可能是权限问题。不要在生产环境中执行 777 chmod,但您必须确保目标文件夹是可写的并且可以使用 www-data(apache2 用户)执行。

更改权限的命令是:

chown -R www-data:www-data path/to/writable/dir/

为了使目录可打开:

chmod -R 660 path/to/wrotable/dir/

chmod +x path/to/writable/dir/

编辑

这取决于您的需求。基本上,您希望对该文件夹具有读/写访问权限的用户应添加到 www-data 组。 命令:useradd -G www-data users

但是,如果您使用 www-data 以外的其他用户创建目录或文件,您可能会遇到一些麻烦。因为该组不会设置为 www-data,而是您的用户组。在这种情况下,您必须设置 acl 权限。如果您是这种情况,请告诉我,我会帮助您设置 acl :)

【讨论】:

  • 谢谢@vekah。这正是我想要的。在上面的命令中,您创建了 apache 组和所有者。这工作得很好,但它确实阻止我在目录中列出,除非我 sudo 并且它阻止我使用 ftp 访问文件夹。有没有更好的方法来使用组和所有者。我对 Linux 很陌生,为我指明正确的方向会很有帮助。谢谢。
  • 为 anwser 编辑了我的帖子。
【解决方案2】:

你应该检查什么返回函数 move_uploaded_file();

 var_dump(move_uploaded_file($_FILES["file"]["tmp_name"]);
 // if return false it can be something with permission on location folder where
 // do you want to store file under linux

从手动 php 这个函数返回:

 If filename is not a valid upload file, 
 then no action will occur, and  move_uploaded_file() will return FALSE.

 If filename is a valid upload file, but cannot be moved for some reason,
 no action will occur, and move_uploaded_file() will return FALSE. 
 Additionally, a warning will be issued. 

【讨论】:

  • 感谢@ZiupeX 我已经这样做了,并且从 Xampp 知道代码本身没问题。
【解决方案3】:

对于带有 XAMPP 的 Ubuntu 14.04,我也遇到了上传问题,但在我用 sudo chmod -R 777 destination 修复后,它运行良好。

例如:

在我的 Ubuntu 14.04 XAMPP 中上传的临时文件夹是 /opt/lampp/temp/。如果我想上传文件到/opt/lampp/temp/testupload 作为目标文件夹,那么我需要下面的配置。

  1. 转到临时文件夹

    cd /opt/lampp/temp/

  2. 在 /opt/lampp/temp/ 下创建“testupload”文件夹

    sudo mkdir testupload

  3. 更改权限 777

    sudo chmod -R 777 /opt/lampp/temp/testupload/

  4. PHP 代码

    move_uploaded_file($_FILES["file"]["tmp_name"], "/opt/lampp/temp/testupload/" . $_FILES["file"]["name"])

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 2012-07-31
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2022-10-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多