在我的项目中,我必须将一些视频文件上传到根文件夹之外的文件夹。我使用简单的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
完成。如果没有,建议更好的选择。
我见过一些类似的问题,但没有任何帮助。所以任何帮助都会受到赞赏..
答案 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)
这很可能是一个简单的权限问题,很容易解决。
找到apache使用的用户。为此,请打开httpd.conf文件并查找类似:
的内容用户apache
集团阿帕奇
更改您尝试上传到的文件夹的所有权。
chown -R apache.apache /usr/local/WowzaMediaServer-3.1.1/content /
更改文件夹的权限
chmod -R 775 /usr/local/WowzaMediaServer-3.1.1/content /
那就应该是那样。
答案 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下),然后从媒体目录创建一个符号链接到您编写它的位置。
例如:
然后你有读/写权限,媒体服务器也应该。唯一的问题是如果媒体服务器经过培训不会读取符号链接 - 但你可以很快找到它。