将文件上传到Linux服务器中根文件夹外的文件夹?

时间:2012-05-15 12:47:11

标签: php linux file-upload

在我的项目中,我必须将一些视频文件上传到根文件夹之外的文件夹。我使用简单的PHP函数move_uploaded_file来上传文件。我尝试过以下代码。

$source  = $_FILES['Filedata']['tmp_name'];
$targetFile = '/usr/local/WowzaMediaServer-3.1.1/content/video.mp4'
move_uploaded_file($source,$targetFile);

但它不起作用。我们可以通过move_uploaded_file完成。如果没有,建议更好的选择。

我见过一些类似的问题,但没有任何帮助。所以任何帮助都会受到赞赏..

6 个答案:

答案 0 :(得分:3)

你确定你不在chroot监狱吗?

如果是这样,你的“绝对”路径名可能指向错误的地方 - 某个地方不存在。

如果是这样,请将路径更改为指向jail中的某个位置。

可能需要mount --bind您想要的目录进入jail中的某个位置。 (请注意,符号链接不适用于离开监狱。)

答案 1 :(得分:2)

我将假设您正在使用Apache来达到此答案的目的。

首先,正在上传的文件好吗?您可能遇到问题的一个可能原因是网络服务器无法写入tmp目录,或者可读性。假设没问题,那么move_uploaded_file应该可以正常工作。

在DOCUMENT_ROOT旁边创建一个文件夹,我们称之为“filestore”。确保它可以通过www-data或任何用户运行apache写入。现在,您应该能够将文件移动到该文件夹​​中。请注意,它们将由www-data拥有:www-data通常 - 或者您的服务器设置为运行的任何用户和组。我把“filestore”文件夹放在DOCUMENT_ROOT文件夹旁边的原因是你可以确定网络服务器可以读取文件路径到DOCUMENT_ROOT。否则,你会冒着文件夹在路径不可读的情况下冒险的风险,这会让你死定。例如如果您的/ usr / local / media作为目标文件夹并且/ usr / local不可由Web服务器读取(并且可执行),那么您就是干杯。

如果所有这些都有效并且你绝对必须在其他地方拥有媒体,只要网络服务器读取/执行它的整个路径,就可以将“filestore”文件夹放在任何地方。检查路径中的每个目录。

如果其他用户通过网络下载这些上传的文件,那么“filestore”文件夹只需要具有700的权限,因为它始终是读取它们的Web服务器的用户。如果其他用户需要访问权限,通常是因为作为其他用户运行的其他软件需要使用它们,那么您可能需要750的权限才能允许组成员读取(和执行)该目录。您还需要将其他用户添加到www-data组。

对于下载,您需要编写一个简单的脚本,在执行一些身份验证检查后将该文件转储到浏览器。这样,您就可以避免仅通过http访问媒体,而无需先进行任何身份验证 - 这可能会使您的服务成为非法文件的有吸引力的地方(此处版权侵犯最少)。

答案 2 :(得分:2)

这很可能是一个简单的权限问题,很容易解决。

  1. 找到apache使用的用户。为此,请打开httpd.conf文件并查找类似:

    的内容

    用户apache
    集团阿帕奇

  2. 更改您尝试上传到的文件夹的所有权。

    chown -R apache.apache /usr/local/WowzaMediaServer-3.1.1/content /

  3. 更改文件夹的权限

    chmod -R 775 /usr/local/WowzaMediaServer-3.1.1/content /

  4. 那就应该是那样。

答案 3 :(得分:1)

这是一种危险的方法,因为它为apache用户提供了root权限,因此请谨慎使用。

将apache用户添加到sudoers列表中 - 这将允许您通过system('sudo the_command')以root身份在php中执行命令。然后将上传的文件移动到apache用户可以写的临时位置(例如,在doc根目录中创建一个'tmp'目录)。然后使用system("sudo mv \"$source\" \"$destination\"");将临时文件移动到它的最终位置。

您可以通过执行<?php echo exec('whoami'); ?>找到apache用户。然后将以下条目添加到sudoers the-apache-user ALL=(ALL) NOPASSWD: ALL。使用visudo添加sudoer条目。

示例:

$source  = $_FILES['Filedata']['tmp_name'];
$targetFile = '/usr/local/WowzaMediaServer-3.1.1/content/video.mp4'

$tempLocation = 'tmp/temp-file.mp4';

move_uploaded_file($source, $tempLocation);

system('sudo mv "' . $tempLocation . '" "' . $targetFile . '"');

修改相关问题 - How to run PHP exec() as root?

答案 4 :(得分:1)

始终您遇到代码问题,查看服务器日志或更轻松地打开错误显示。也就是说,您的问题可能与upload_tmp_dir设置有关。检查phpinfo()告诉您的内容或查看您的php.ini文件。

答案 5 :(得分:0)

更好的解决方案是将文件写入您可以编写的位置(即在webroot下),然后从媒体目录创建一个符号链接到您编写它的位置。

例如:

  • Web Root是/ var / www / html
  • 你想要它/usr/local/WowzaMediaServer-3.1.1/content /
  • 创建目录/ var / www / html / mediaserver / content /
  • 在/ var / www / html / mediaserver / content / 777上创建权限(以便apache可以写入)
  • 将文件从/usr/local/WowzaMediaServer-3.1.1/content/复制到/ var / www / html / mediaserver / content /
  • 删除/usr/local/WowzaMediaServer-3.1.1/content/(只是“内容”目录)
  • 从/usr/local/WowzaMediaServer-3.1.1/content/创建符号链接到/ var / www / html / mediaserver / content /

然后你有读/写权限,媒体服务器也应该。唯一的问题是如果媒体服务器经过培训不会读取符号链接 - 但你可以很快找到它。