PHP无法将上传的文件移动(写入)到已安装的网络驱动器

时间:2013-03-20 20:36:49

标签: php linux windows sharing mount

首先我要说的是,我是一名开发人员,而不是服务器管理员......对我这么光顾

在工作中,我们通过在每台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'

我不了解与linux和PHP需要写入网络的网络共享驱动器相关的文件权限?我似乎无法找到挂断电话!

一旦我们投入生产,我们将不会使用该架构,但如果有一个简单的解决方案能够在我们当前的开发环境中继续,那么这将是理想的! (我也可能在这里学到一些东西:P)

提前谢谢大家!

1 个答案:

答案 0 :(得分:4)

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

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

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

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

希望这有用!