0

我们通过在每台 Windows 机器上的共享本地目录中编辑工作文件来开发基于 PHP 的 Web 应用程序。然后(linux)登台服务器安装我们的共享驱动器并在子域下为它们提供服务。例如 joe.work.com 将服务于 Joe 的工作目录。然后,我们通过编辑我们的主机文件以将子域指向登台服务器来访问我们自己的登台站点……所有这些都很好!

我们现在遇到的问题是 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 需要写入它?我似乎找不到挂机!

一旦我们投入生产,我们将不会使用模式,但如果有一个简单的解决方案能够在我们当前的开发环境中继续,那将是理想的!

4

1 回答 1

4

经过几个小时的翻脸,我终于找到了我所缺少的东西。问题是提供的凭据无法按预期写入已安装的目录。我能够解决这个问题的方法是通过如下编辑 mount 命令:

mount -t cifs //shared/directory /mount/target
    -o rw,username=connectionuser,password=password,uid=48

所以,username并且password将是用于连接到驱动器的 Windows 凭据,但uid指定 apache 运行的登台服务器上本地用户的唯一标识符,以便它可以写入已安装的目录。

以前,我没有指定本地用户的 uid,所以当 apache 试图写入挂载目录时,它试图使用 Windows 凭据(无法在“本地”驱动器上写入)

希望这会有所帮助!

于 2013-03-21T00:17:31.523 回答