我正在使用PHP开发一个CMS作为学习练习,但是打了一个名为“open_basedir restriction”的砖墙 - 我正在尝试上传一个小的JPG文件。我尽量简明扼要地提供尽可能多的信息,但如果我忘了什么就告诉我!
我可以看到它每次都点击c:/ windows / temp /文件夹 所以它只会在尝试执行 move_uploaded_file 操作时摔倒。
经过大量研究后,我知道这是什么,理论上如何通过在线阅读多个页面来修复它,例如:
http://forum.parallels.com/showthread.php?258036-Plesk-Windows-open_basedir-restriction-in-effect
我的代码
$uiq = uniqid();
$image_folder = "/img/articles/original/";
$uploaded = false;
if(isset($_POST['upload_image'])){
if($_FILES['userImage']['error'] == 0 ){
$up = move_uploaded_file($_FILES['userImage']['tmp_name'], $image_folder.$_FILES['userImage']['name']);
if($up){
$uploaded = true;
}
}
}
我的PHPINFO
我的PhpInfo结果显示我的网络托管空间的根目录在允许的文件夹列表中:
open_basedir:F:\ PLESK \ WWW \ mydomain.com \ httpdocs \
错误
PHP警告:move_uploaded_file():open_basedir限制生效。文件(/img/articles/original/test.jpg)不在允许的路径中:F:\ PLESK \ WWW \ mydomain.com \ httpdocs中的(F:\ PLESK \ WWW \ mydomain.com \ httpdocs)第40行的\ sparklyphp \ cms \ modules \ articles \ edit \ photos \ index.php
更多错误
如果我改变路径
$image_folder = "/img/articles/original/";
到
$image_folder = "img/articles/original/";
我收到其他错误:
PHP Warning: move_uploaded_file(): open_basedir restriction in effect. File(C:\Windows\Temp\php393F.tmp) is not within the allowed path(s): (F:\PLESK\WWW\mydomain.com\httpdocs\) in F:\PLESK\WWW\mydomain.com\httpdocs\sparklyphp\cms\modules\articles\edit\photos\index.php on line 40
PHP Warning: move_uploaded_file(): open_basedir restriction in effect. File(C:\Windows\Temp\php393F.tmp) is not within the allowed path(s): (F:\PLESK\WWW\mydomain.com\httpdocs\) in F:\PLESK\WWW\mydomain.com\httpdocs\sparklyphp\cms\modules\articles\edit\photos\index.php on line 40
PHP Warning: move_uploaded_file(C:\Windows\Temp\php393F.tmp): failed to open stream: Operation not permitted in F:\PLESK\WWW\mydomain.com\httpdocs\sparklyphp\cms\modules\articles\edit\photos\index.php on line 40
PHP Warning: move_uploaded_file(): Unable to move 'C:\Windows\Temp\php393F.tmp' to 'img/articles/original/test.jpg' in F:\PLESK\WWW\mydomain.com\httpdocs\sparklyphp\cms\modules\articles\edit\photos\index.php on line 40
**托管环境** 网站托管环境是一个Windows 2008 R2框,其中包含在FastCGI模式下运行PHP 5.4.16的Plesk 11.5(最新版本/更新)。我拥有对整个服务器的完全管理员权限。
这里最令人沮丧的是文件被上传到临时文件夹,我无法从那里得到它!
非常感谢任何帮助!
鲍勃
答案 0 :(得分:1)
我没有想法,为什么这有效。好的,最后我通过抓取并存储当前工作目录并将工作目录切换到站点的根目录来解决这个问题:
$storeOriginalPath = getcwd();
chdir($_SERVER['DOCUMENT_ROOT']);
执行上传:
$uiq = uniqid();
$image_folder = "img/articles/original/";
$uploaded = false;
if(isset($_POST['upload_image'])){
if($_FILES['userImage']['error'] == 0 ){
$up = move_uploaded_file($_FILES['userImage']['tmp_name'], $image_folder.$_FILES['userImage']['name']);
if($up){
$uploaded = true;
}
}
}
转回来了:
chdir($storeOriginalPath);
所以我正在考虑将 chdir($ _ SERVER ['DOCUMENT_ROOT']); 放在我所有PHP页面的开头并且拥有相对于root的所有东西(这就是我以前所习惯的) ASP),这是常见的,不明智的,聪明的,有臭味的还是仅仅是愚蠢的?
答案 1 :(得分:1)
此:
PHP Warning: move_uploaded_file(): open_basedir restriction in effect.
File(C:\Windows\Temp\php393F.tmp) is not within the allowed path(s):
(F:\PLESK\WWW\mydomain.com\httpdocs\) in
F:\PLESK\WWW\mydomain.com\httpdocs\sparklyphp\cms\modules\articles\edit\photos\index.php on line 40
基本上是说不允许你的临时文件夹。 AFAIK显然是一个错误的配置,你应该联系你的主机来解决它。或者,如果您拥有像您所说的完全管理员权限,只需将open_basedir限制更改为理智。 This page看起来包含有关更改/删除open_basedir设置的内容。
答案 2 :(得分:0)
$image_folder = "/img/articles/original/";
...
$up = move_uploaded_file($_FILES['userImage']['tmp_name'], $image_folder...
以上代码将尝试将文件移动到Windows系统上的绝对位置/img/...
,我认为这将被解释为例如F:\img\...
默认情况下,Plesk只允许php应用程序写入域的文档根目录或tmp文件夹 - 因此您可能需要更改目标文件夹路径:
// edit this and make sure this points somewhere writable
$image_folder = "./img/articles/original/";
要写入文档根目录下的文件夹。