【问题标题】:Where is my $_FILES['temp_name'] being set? -angularjs app我的 $_FILES['temp_name'] 设置在哪里? -angularjs 应用程序
【发布时间】:2014-01-07 04:51:33
【问题描述】:

这已经困扰我好几个小时了..

我正在用 angularjs 编写一个应用程序,并试图让文件上传的 php 端正常工作。

似乎 php 脚本正在尝试将文件从 /tmp/randomuniquefilename 复制到正确的目录。问题是我根本不希望它存储在我的根临时文件夹中。我已将 PHP.ini 默认文件上传路径更改为 /var/www/tmp/ /var/www/tmp/ 文件夹存在并具有正确的权限。

我想知道我的$_FILES[ 'file' ][ 'tmp_name' ] 变量的设置方式/位置,以便我可以更改它。我之前确实尝试过简单的$_FILES[ 'file' ][ 'tmp_name' ] = '/var/www/tmp/' 这对我不起作用。

我的 php 错误:

[2014 年 1 月 7 日星期二 15:46:14] [错误] [客户端 127.0.0.1] PHP 警告:move_uploaded_file(/var/www/funandgames/jobernize/uploaded/bleg.png):无法打开流:权限在第 18 行的 /var/www/funandgames/jobernize/uploaded/test.php 中被拒绝,引用者:http://127.0.0.1/funandgames/jobernize/

[Tue Jan 07 15:46:14 2014] [error] [client 127.0.0.1] PHP Warning: move_uploaded_file(): Unable to move '/tmp/phpbkz0xn' to '/var/www/funandgames/jobernize/在第 18 行的 /var/www/funandgames/jobernize/uploaded/test.php 中上传/bleg.png',引用者:http://127.0.0.1/funandgames/jobernize/

可能是我的 js 设置了那个 var,还是 PHP?

这是我的 php:

<?php

if ( !empty( $_FILES ) ) {
    
    function varDumpToString ($var)
    {
        ob_start();
        var_dump($var);
        $result = ob_get_clean();
        error_log($result);
    }

    varDumpToString($_FILES);

    $tempPath = '/var/www' . $_FILES[ 'file' ][ 'tmp_name' ];
    $uploadPath = dirname( __FILE__ ) . '/' . $_FILES[ 'file' ][ 'name' ];

    error_log($tempPath);

    move_uploaded_file( $tempPath, $uploadPath );

    $answer = array( 'answer' => 'File transfer completed' );
    $json = json_encode( $answer );

    echo $json;

} else {

    echo 'No files';

}

?>

我只是将 /var/www 附加到路径中,现在我没有收到任何错误,但什么也没发生,文件没有被复制。

由于某种原因,临时名称似乎包含 /tmp/ 而不仅仅是文件名,这正常吗?

【问题讨论】:

  • 您在更改php.ini 后是否重新启动了Web 服务器?仅供参考,tmp_name 设置在服务器端,您的 permission denied 错误与源文件无关,但与目标路径无关
  • 是的,我知道了,谢谢,没有时间处理目标路径,只想获取正确的源路径。
  • 检查phpinfo()upload_tmp_dir 设置显示的内容。此外,tmp_name 将包含完整路径。你不要在它前面加上任何东西
  • 好的,所以默认设置tmp_name?我现在就这样做谢谢
  • 是的,通常move_uploaded_file() 的第一个参数就是$_FILES['file']['tmp_name']。另请注意手册 - “如果此处指定的目录 (upload_tmp_dir) 不可写,则 PHP 将回退到系统默认临时目录。”。这可以解释你所看到的。如果系统 tmp 目录可用,使用它也没有任何问题

标签: php angularjs


【解决方案1】:

只要把tmp_file_upload的权限改成755下面是命令chmod -R 755 tmp_file_upload

这是因为imagestmp_file_upload 只能由root 用户写入。为了上传工作,我们需要使这些文件夹的所有者与 httpd 进程所有者相同,或者使它们全局可写(不好的做法)。

  1. 检查 apache 进程所有者:$ps aux | grep httpd。第一列将是所有者,通常是nobody
  2. imagestmp_file_upload 的所有者更改为nobody 或您在步骤1 中找到的任何所有者。

    $sudo chown nobody /var/www/html/mysite/images/

    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/

  3. Chmod imagestmp_file_upload 现在可以由所有者写入,如果需要的话[似乎你已经有了这个]。在@Dmitry Teplyakov 的回答中提到。

    $ sudo chmod -R 0755 /var/www/html/mysite/images/

    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/

  4. 有关此行为发生原因的更多详细信息,请查看手册 http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir,注意它还涉及 open_basedir 指令。

【讨论】:

  • 越来越多的主机通过 suExec 或类似的方式以普通用户的身份运行 PHP 脚本。自动假设需要 httpd 用户是愚蠢的。
  • 我检查了它并没有以无人身份运行,它以对所有必要文件具有权限的同一用户身份运行
猜你喜欢
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2011-09-23
  • 2013-06-19
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多