尝试重命名 PHP 中的两个文件
Trying to rename two files in PHP
我正在使用 Ubuntu 12.04,apache2 + nginx (ISPManager)
我的服务器使用 Wowza Media Server,该服务器将我录制的 .flv
视频放在 {root-of-the-server}/movies
中
我收到来自 $_GET['rfile']
动作的视频名称:$this->request->get('rfile')
。
文件在文件夹中创建成功,我通过两种方式定位:
file_get_contents('http://<ip, which sends to {root-of-the-server}>/movies/'.$this->request->get('rfile'));
或
`find /movies/ -name $rfile`;
为了将我录制的视频从 Wowza 文件夹上传到网站,我试图在录制停止后重命名文件:
来自
'{root-of-the-server}/movies/$this->request->get('rfile').flv'
至
'.$_SERVER['DOCUMENT_ROOT'].'/upload/resume/resume'.$item['id'].'.flv'
我用$_SERVER['DOCUMENT_ROOT']
,因为我需要自动移动录制的视频,而且在几个网站上。
注意:我没有把 {root-of-the-server}
放在我的实际脚本中,那只是一个占位符,用于在此处发布。
我正在尝试将其重命名为 PHP。
第一次尝试:
shell_exec('mv /movies/'.$this->request->get('rfile').''.$_SERVER['DOCUMENT_ROOT'].'/upload/resume/resume'.$item['id'].'.flv');
第二次尝试:
mv /movies/$rfile /movies/ok-just-rename-it-plz.flv
第三次尝试:
rename('http://95.183.8.96:81/'.$this->request->get('rfile'), 'http://95.183.8.96:81/'.$item['id'].'.flv');
第四次尝试:
rename('/movies/'.$this->request->get('rfile'), '/upload/resume/resume'.$item['id'].'.flv');
但是 none 这些尝试都奏效了。如何使用 http 包装器重命名这两个文件?或者我怎样才能用另一种方式重命名它们?
rename
就是您所需要的。如果可以通过 HTTP,您就会有一个主要的安全漏洞,因此请坚持使用绝对路径。确保您的目标目录可写 PHP:
echo is_writable($_SERVER['DOCUMENT_ROOT'] . '/upload/resume/resume') ? 'yup' : 'nope';
同时检查以确保源文件确实存在:
echo file_exists('/movies/' . $this->request->get('rfile')) ? 'yup' : 'nope';
并且您有权阅读它:
echo is_readable('/movies/' . $this->request->get('rfile')) ? 'yup' : 'nope';
如果其中任何一个失败,您将遇到权限问题,您需要使用一些 chmod
或 chown
.
来纠正
我这几天的问题出在ISPmanager的open_basedir
(open_basedir
默认是开启的)。
我去了 /etc/apache2/apache2.conf
并进行了这些更改:
<Directory /var/www/USER/data/www/WEBSITE>
php_admin_value open_basedir "/movies:/var/www/USER/data:."
</Directory>
而不是
<Directory /var/www/USER/data/www/WEBSITE>
php_admin_value open_basedir "/var/www/USER/data:."
</Directory>
无论如何,感谢 Kevin Nagurski 的回答:33
我正在使用 Ubuntu 12.04,apache2 + nginx (ISPManager)
我的服务器使用 Wowza Media Server,该服务器将我录制的 .flv
视频放在 {root-of-the-server}/movies
我收到来自 $_GET['rfile']
动作的视频名称:$this->request->get('rfile')
。
文件在文件夹中创建成功,我通过两种方式定位:
file_get_contents('http://<ip, which sends to {root-of-the-server}>/movies/'.$this->request->get('rfile'));
或
`find /movies/ -name $rfile`;
为了将我录制的视频从 Wowza 文件夹上传到网站,我试图在录制停止后重命名文件:
来自
'{root-of-the-server}/movies/$this->request->get('rfile').flv'
至
'.$_SERVER['DOCUMENT_ROOT'].'/upload/resume/resume'.$item['id'].'.flv'
我用$_SERVER['DOCUMENT_ROOT']
,因为我需要自动移动录制的视频,而且在几个网站上。
注意:我没有把 {root-of-the-server}
放在我的实际脚本中,那只是一个占位符,用于在此处发布。
我正在尝试将其重命名为 PHP。
第一次尝试:
shell_exec('mv /movies/'.$this->request->get('rfile').''.$_SERVER['DOCUMENT_ROOT'].'/upload/resume/resume'.$item['id'].'.flv');
第二次尝试:
mv /movies/$rfile /movies/ok-just-rename-it-plz.flv
第三次尝试:
rename('http://95.183.8.96:81/'.$this->request->get('rfile'), 'http://95.183.8.96:81/'.$item['id'].'.flv');
第四次尝试:
rename('/movies/'.$this->request->get('rfile'), '/upload/resume/resume'.$item['id'].'.flv');
但是 none 这些尝试都奏效了。如何使用 http 包装器重命名这两个文件?或者我怎样才能用另一种方式重命名它们?
rename
就是您所需要的。如果可以通过 HTTP,您就会有一个主要的安全漏洞,因此请坚持使用绝对路径。确保您的目标目录可写 PHP:
echo is_writable($_SERVER['DOCUMENT_ROOT'] . '/upload/resume/resume') ? 'yup' : 'nope';
同时检查以确保源文件确实存在:
echo file_exists('/movies/' . $this->request->get('rfile')) ? 'yup' : 'nope';
并且您有权阅读它:
echo is_readable('/movies/' . $this->request->get('rfile')) ? 'yup' : 'nope';
如果其中任何一个失败,您将遇到权限问题,您需要使用一些 chmod
或 chown
.
我这几天的问题出在ISPmanager的open_basedir
(open_basedir
默认是开启的)。
我去了 /etc/apache2/apache2.conf
并进行了这些更改:
<Directory /var/www/USER/data/www/WEBSITE>
php_admin_value open_basedir "/movies:/var/www/USER/data:."
</Directory>
而不是
<Directory /var/www/USER/data/www/WEBSITE>
php_admin_value open_basedir "/var/www/USER/data:."
</Directory>
无论如何,感谢 Kevin Nagurski 的回答:33