设置PHP tmp目录 - PHP上传不起作用

时间:2012-09-21 13:19:16

标签: php file-upload valums-file-uploader

我正在使用Valums file uploader通过带有进度条的网页上传文件。几乎一切正常,但我无法更改默认的tmp目录,在上传期间存储文件。

文件应存储在/upload目录中,而不是存储在默认系统/tmp目录中,因为/tmp安装在RAM磁盘中,其大小限制为4 MB,用户将是上传大约10 MB的文件。

我搜索了很多网页,但没有一个解决方案有效。 我在php.ini中设置了临时目录:

upload_tmp_dir =/upload

我已经设置了/upload目录的权限,而apache是​​该文件的所有者,因此该目录肯定是PHP可写的。

我已将文件上传器中的目标路径设置为/upload,因为我希望在上传后也将文件存储在此目录中。最终结果是成功上传了小文件,但是大于4 MB的文件无法上传 - 我想到这种行为的唯一原因是文件在上传期间存储在/tmp中。可以肯定的是,我已经使用sys_get_temp_dir()进行了检查,结果是/tmp - 因此PHP忽略了我的php.ini指令,或者还有一些其他方法来设置上传期间存储文件的位置。

哦,最后一条信息:open_basedir未设置,因此对磁盘的PHP访问仅受文件权限的限制。

6 个答案:

答案 0 :(得分:62)

这里描述的问题很久以前就已经解决了,但我真的不记得上传不起作用的主要原因。有许多事情需要修复,以便上传可以工作。我创建了可能帮助其他人遇到类似问题的清单,我将对其进行编辑以使其尽可能有用。正如我之前在聊天时所说的那样,我正在研究嵌入式系统,因此在非嵌入式系统上可能会跳过一些要点。

  • 检查php.ini中的upload_tmp_dir。这是PHP在上传时存储临时文件的目录。

  • 检查php.ini中的open_basedir。如果已定义,则会限制对指定路径及其子目录的PHP读/写权限。确保upload_tmp_dir在此路径中。

  • 检查php.ini中的post_max_size。如果您要上传20 Mbyte文件,请尝试更大的内容,例如post_max_size = 21M。这定义了您在上传期间可能使用的最大POST消息大小。

  • 检查php.ini中的upload_max_filesize。这指定了可以上传的最大文件。

  • 检查php.ini中的memory_limit。这是脚本可能消耗的最大内存量。很明显,它不能低于上传大小(说实话我不太确定 - 复制临时文件时PHP可能正在缓冲)。

  • 确保您正在检查您的网络服务器上PHP使用的正确php.ini文件。最好的解决方案是使用此处描述的指令执行脚本http://php.net/manual/en/function.php-ini-loaded-file.phpphp_ini_loaded_file函数)

  • 检查用户运行的用户身份(请参阅此处如何操作:How to check what user php is running as?)。我曾经在不同的发行版和服务器上工作过。有时它是apache,但有时可能是root。无论如何,请检查此用户是否有权在您上传的临时目录和目录中进行读写。检查路径中的所有目录,以防您上传到子目录(例如/dir1/dir2/ - 同时检查dir1dir2

  • 在嵌入式平台上,您有时需要限制写入根文件系统,因为它存储在闪存卡上,这有助于延长此卡的使用寿命。如果您使用脚本来启用/禁用文件写入,请确保在上载之前启用写入。

  • 我在某些平台上遇到了基于会话的PHP> 5.4上传监控(如http://phpmaster.com/tracking-upload-progress-with-php-and-javascript/所述)。首先尝试简单的事情(例如:http://www.dzone.com/snippets/very-simple-php-file-upload)。如果它有效,你可以尝试更复杂的机制。

  • 如果您在php.ini中进行任何更改,请记住重新启动服务器,以便重新加载配置。

答案 1 :(得分:2)

我很长时间都在努力解决这个问题...... 我的解决方案是在包含php脚本的文件夹中修改php.ini文件。这很重要,因为修改根目录下的php.ini并没有解决问题(我在每个文件夹中都有一个用于粒度控制的php.ini)。 我的php.ini中的相关条目看起来像这样....(此问题可能不需要output_buffering)

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M

答案 2 :(得分:0)

使用以下命令创建php文件

<?php
    print shell_exec( 'whoami' );
?>

<?php echo exec('whoami'); ?>

在网络浏览器中尝试输出。 如果输出不是您的用户示例: www-data 然后继续下一步

以root身份打开:

  

/ etc / apache2 / envvars

查找以下行:

  

导出APACHE_RUN_USER =用户名

     

导出APACHE_RUN_GROUP =组名

示例:

  

导出APACHE_RUN_USER = www数据

     

导出APACHE_RUN_GROUP = www-data

其中:

username =您的用户名,可以访问您正在使用的文件夹 group =您已授予读,写,执行访问权限的组

将其更改为:

  

导出APACHE_RUN_USER =“用户名”

     

导出APACHE_RUN_GROUP =“ group”

如果您的用户尚无访问权限:

  

sudo chmod 775 -R“您要授予r / w / x访问权限的文件夹目录”

答案 3 :(得分:0)

在我的情况下,定义的是open_basedir。我已将其注释掉(默认),问题已解决。我现在可以在任何地方设置上传目录。

答案 4 :(得分:0)

我的问题是selinux ...

开始 sestatus

如果 当前模式:强制执行

然后 chcon -R -t httpd_sys_rw_content_t / var / www / html

答案 5 :(得分:0)

我也面临同样的问题2天,但现在终于可以了。

第1步:使用此内容创建一个php脚本文件。

<?php 
 echo 'username : ' . `whoami`;
 phpinfo();
?>

记下用户名。 注意phpinfo核心部分下的open_basedir。 还请注意phpinfo核心部分下的upload_tmp_dir。

以下两点很重要, 查看upload_tmp_dir值是否在open_basedir目录之一内。 (php无法将文件上传到open_basedir目录之外)。

第2步:打开具有root用户访问权限的终端,然后转到upload_tmp_dir位置。 (在我的情况下为“ / home / admin / tmp”。)

  => cd /home/admin/tmp

但是在我的情况下未找到它,所以我创建了它并为步骤1中获得的php用户添加了chown(在我的情况下为“ admin”)。

  => mkdir /home/admin/tmp
  => chown admin /home/admin/tmp

这是解决文件上传问题的全部工作。