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

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

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

希望这有帮助!

【讨论】:

以上是关于PHP 无法将上传的文件移动(写入)到挂载的网络驱动器的主要内容,如果未能解决你的问题,请参考以下文章

如何将 S3 存储桶挂载到 EC2 实例并使用 PHP 写入?

PHP文件上传写入磁盘错误

PHP小知识

Linux 系统挂载 ntfs 移动硬盘无法写入的问题

linux 如何挂载移动硬盘

无法上传文件,php和angularjs