PHP 无法将上传的文件移动(写入)到挂载的网络驱动器
Posted
技术标签:
【中文标题】PHP 无法将上传的文件移动(写入)到挂载的网络驱动器【英文标题】:PHP can't move (write) uploaded files to mounted network drive 【发布时间】:2013-03-20 20:36:49 【问题描述】:我们通过在每台 Windows 机器上的共享本地目录中编辑工作文件来开发基于 php 的 Web 应用程序。然后(linux)登台服务器安装我们的共享驱动器并在子域下为它们提供服务。例如。 joe.work.com 将服务于 Joe 的工作目录。然后,我们通过编辑 hosts 文件以将子域指向临时服务器来访问我们自己的临时站点……所有这些都非常有效!
我们现在遇到的问题是 PHP 似乎无权将上传的文件从 tmp 目录移动到已安装目录(实际上是共享的 Windows 驱动器...?)内的目录。
windows 机器上的工作目录设置为允许所有人 rw,我尝试将 777 放在暂存机器的挂载目录上,但我仍然被拒绝权限。
共享驱动器,例如,\\joes_machine\joes_working_dir
安装在登台服务器上到 /var/mnt/joe
。文件上传需要移动到/images/common
。
尽管这个例子稍微有点笨拙,但我并没有在代码方面做任何花哨的事情:
$working_directory = '/var/mnt/joe';
$image_directory = '/images/common/';
$full_filename = $working_directory . $image_directory . $filename;
if(move_uploaded_file($_FILES['photo']['tmp_name'], $full_filename))
// do some other stuff
我的错误当然是:
Message: move_uploaded_file(/var/mnt/joe/images/common/resulting_filename.jpg):
failed to open stream: Permission denied
Message: move_uploaded_file(): Unable to move '/tmp/phpjsEfBc' to
'/var/mnt/joe/images/common/resulting_filename.jpg'
我不了解与通过网络安装的 Windows 共享驱动器相关的文件权限,而 PHP 需要写入它?我似乎找不到挂机!
一旦我们投入生产,我们将不会使用架构,但如果有一个简单的解决方案能够在我们当前的开发环境中继续,那将是理想的!
【问题讨论】:
【参考方案1】:经过几个小时的翻脸,我终于找到了我缺少的东西。问题是提供的凭据无法按预期写入已安装的目录。我能够解决这个问题的方法是通过如下编辑 mount 命令:
mount -t cifs //shared/directory /mount/target
-o rw,username=connectionuser,password=password,uid=48
所以,username
和 password
将是用于连接到驱动器的 Windows 凭据,但 uid
指定 apache 运行的登台服务器上本地用户的唯一标识符,以便它可以写入到挂载的目录。
以前,我没有指定本地用户的 uid,所以当 apache 尝试写入挂载目录时,它尝试使用 windows 凭据(无法在“本地”驱动器上写入)
希望这有帮助!
【讨论】:
以上是关于PHP 无法将上传的文件移动(写入)到挂载的网络驱动器的主要内容,如果未能解决你的问题,请参考以下文章