我正在一个页面上,用户可以在其中使用表单上传图像/视频。该代码包括以下行:
move_uploaded_file($tempfile, $newfile)
然后,将根据此图像/视频自动创建缩略图,并将其上传到服务器,如下所示:
file_put_contents($thumbname, $thumbnail)
现在,图像的上传可以正常工作,但是缩略图无法保存,我得到以下响应:
Warning: file_put_contents(thumbnails/1.jpg): failed to
open stream: Permission denied in
SITEURL/upload.php on line 17
我的两个问题:
为什么用户具有通过move_uplaoded_file上传图像但通过file_put_contents上传缩略图的权限?请注意,图像和缩略图这两个文件都被上载到同一文件夹。用户是否应该既没有权限又没有权限?
我确实意识到已经有一个这样的线程,但是建议的答案是运行chmod 777。但是我读到将文件夹设置为777始终存在安全风险。没有777,有没有办法解决此问题?
同样,我不明白为什么我必须将file_put_contents的权限更改为777,而move_uploaded_file在755才能正常工作。
chmod -R u+rwx,g-rw,o-x thumbnails向所有者授予读取,写入和执行权限,但拒绝对组和其他用户执行执行访问。 chmod足够强大,可以更仔细地管理权限。 比777更仔细,那可以肯定
@EliasVanOotegem是chmod -R 766的老手吗?
@NiettheDarkAbsol:是的,但是我发现u+rwx和g-wx表示法更加清晰:_U_ser,_G_roup,_O_ther,_A_ll,+用于授予,-用于拒绝和_R_ead,_W_rite,e_X_ecute。 ..(当然,您知道这一点,但是此说明是针对OP ;-P的)
@EliasVanOotegem足够公平-也许我只是一个"数字"人物,因为我发现766更容易理解XD
@NiettheDarkAbsol:对于每个人,只要我们都同意最好避免使用chmod -R 777,那么一切都很好
@EliasVanOotegem同意。 chmod -R 777与eval差不多是"问题解决" ...
采用:
// PHP code:
echo `whoami`;
找出运行PHP的用户身份。
然后检查拥有thumbnails的服务器
# log in via SSH and run:ls -l | grep thumbnails
这应该向您显示这样的一行(取自我自己的服务器):
drwxr-xr-x 8 niet niet 4096 Jul 15 12:12 thumbnails
在上面的示例中,该文件夹由用户niet拥有,并且位于组niet中。 如果与ealier中的whoami不同,则需要更改文件夹的所有者。 例如,如果whoami给了user3041398,则可以这样做:
chown user3041398 thumbnails
再次运行ls行,您现在应该在输出中看到您的用户名,并且PHP应该能够写入该文件夹。
php代码给了我www-data,所以我将缩略图的用户从root更改为www-data。 而且有效! 非常感谢!!
@ user3041398很高兴我可以帮助您:)请考虑接受此答案^ _ ^