PHP上传文件代码适用于Windows XAMPP,但不适用于生产Linux机箱

时间:2014-02-20 20:56:24

标签: php linux file-upload xampp

我正在使用此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的朋友看看这个,他写了一些上传脚本。我们无法找到解决方案。

任何提示?

3 个答案:

答案 0 :(得分:1)

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

更改权限的命令是:

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

答案 1 :(得分:0)

你应该检查什么返回函数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. 

答案 2 :(得分:0)

对于使用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”])