33

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

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

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

upload_tmp_dir =/upload

我已经设置了该目录的权限/upload,并且 apache 是该文件的所有者,所以该目录绝对是 PHP 可写的。

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

哦,最后一个信息:open_basedir没有设置,所以 PHP 对磁盘的访问仅受文件权限的限制。

4

6 回答 6

76

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

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

  • open_basedir入 php.ini。如果已定义,它将 PHP 读/写权限限制为指定路径及其子目录。确保它upload_tmp_dir在此路径内。

  • post_max_size入 php.ini。如果您想上传 20 MB 的文件,请尝试更大一点的文件,例如post_max_size = 21M. 这定义了您在上传期间可能使用的最大 POST 消息大小。

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

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

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

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

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

  • 在某些平台上,我在基于会话的 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 中进行任何更改,请记住重新启动服务器,以便重新加载配置。

于 2013-04-18T19:35:17.037 回答
3

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

output_buffering = On 
upload_max_filesize = 20M 
post_max_size = 21M
于 2016-06-02T15:00:27.340 回答
1

使用以下命令创建 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

在哪里:

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

将其更改为:

导出 APACHE_RUN_USER="用户名"

导出 APACHE_RUN_GROUP="组"

如果您的用户还没有访问权限:

sudo chmod 775 -R "你想授予 r/w/x 访问权限的文件夹目录"

于 2018-11-12T17:35:11.477 回答
0

我的问题是selinux ...

sestatus

如果 当前模式:执行

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

于 2019-05-30T06:25:35.627 回答
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

这就是解决文件上传问题所要做的一切。

于 2020-04-10T11:12:21.410 回答
-1

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

于 2019-03-01T21:20:00.147 回答