1

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

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

但它不起作用。我们可以通过move_uploaded_file. 如果没有,建议一个更好的选择来做到这一点。

我见过一些类似的问题,但没有任何帮助。所以任何帮助将不胜感激..

4

6 回答 6

3

你确定你不在chroot监狱里吗?

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

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

可能需要将mount --bind您希望将其放入监狱中某个位置的目录。(请注意,符号链接不适用于越狱。)

于 2012-05-20T20:35:16.473 回答
2

我将假设您出于此答案的目的使用 Apache。

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

在您的 DOCUMENT_ROOT 旁边创建一个文件夹,我们称之为“文件存储”。确保它可由 www-data 或任何运行 apache 的用户写入。现在,您应该能够将文件移动到该文件夹​​中。请注意,它们通常由 www-data:www-data 拥有 - 或者您的服务器设置为运行的任何用户和组。我将“filestore”文件夹放在 DOCUMENT_ROOT 文件夹旁边的原因是您可以确保网络服务器可以读取到 DOCUMENT_ROOT 的文件路径。否则,您将面临路径不可读的文件夹部分风险,这将阻止您死亡。例如,如果您将 /usr/local/media 作为目标文件夹,并且 /usr/local 不能被网络服务器读取(和可执行),那么您就完蛋了。

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

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

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

于 2012-05-19T18:00:09.243 回答
2

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

  1. 找到 apache 使用的用户。为此,请打开您的 httpd.conf 文件并查找以下内容:

    用户 apache
    组 apache

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

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

  3. 更改文件夹的权限

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

应该就是这样。

于 2012-05-23T13:02:04.167 回答
1

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

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

您可以通过执行找到 apache 用户<?php echo exec('whoami'); ?>。然后将以下条目添加到 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 . '"');

编辑:相关问题 -如何以 root 身份运行 PHP exec()?

于 2012-05-17T16:17:29.787 回答
1

总是遇到代码问题,查看服务器日志或更容易打开错误显示。也就是说,您的问题可能与upload_tmp_dir设置有关。检查 aphpinfo()讲述的内容或查看您的php.ini文件。

于 2012-05-20T07:39:31.613 回答
0

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

例如:

  • Web 根目录是 /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/ 的符号链接

然后你有读/写的权限,媒体服务器也应该有。唯一的问题是媒体服务器是否经过培训不阅读符号链接 - 但您可以足够快地找到它。

于 2012-05-19T02:42:36.617 回答