php无法为某些用户而不是其他用户打开流错误

时间:2015-10-22 15:11:50

标签: php ftp

我一直在搜索有关此错误的StackExchange主题,但没有找到任何反映我所遇到的内容。

我目前的状态是我有一个网页,其中包含使用d3.js设置的可视化,其中某些对象是可点击的。点击其中一个后,通过AJAX执行php脚本(基于点击该对象的变量传递),通过该脚本运行查询到MSSQL数据库,该数据库返回要通过FTP检索的图像列表。到目前为止,我知道这部分正在发挥作用。

代码托管在运行IIS的Win 2008 r2服务器上。

在检索图像数组后,执行一个循环,我查看它们是否已经下载,如果没有,则在下面的循环中通过FTP获取图像:

        if(in_array($fileName,$files)) {
            //*** Look to see if the image has already been FTP'd
            $fileTo = "C:/inetpub/wwwroot/IRIS/images/" . $fileName;
        } else {
            $FTP_HOST = $wrow["serverId"] . ".prod.com";

            // *** Create the FTP object
            $ftpObj = new FTPClient();

            // *** Connect
            try{
                $ftpObj->connect($FTP_HOST,$FTP_USER,$FTP_PASS);
            } catch (PDOException $uc) {
                header('Content-type: application/json');
                echo json_encode("Error making the FTP connection");
                die();
            }

            $fileFrom = $wrow["fileSpec"];
            $fileTo = "C:/inetpub/wwwroot/IRIS/images/" . $fileName;

            try {
                $ftpObj->downloadFile($fileFrom,$fileTo);
            }catch (PDOException $uc) {
                header('Content-type: application/json');
                echo json_encode("Error transfering the file");
                die();
            }
        }

代码进入最后的try / catch循环,调用我在downloadFile所在的FTP类。请注意,在建立连接时,所有用户都使用相同的用户名和密码。

在ftp_class.php中,连接如下:

public function connect ($server, $ftpUser, $ftpPassword, $isPassive = false) {

    // *** Set up basic connection
    $this->connectionId = ftp_connect($server);

    // *** Login with username and password
    $loginResult = ftp_login($this->connectionId, $ftpUser, $ftpPassword);

    // *** Sets passive mode on/off (default off)
    ftp_pasv($this->connectionId, $isPassive);

    // *** Check connection
    if ((!$this->connectionId) || (!$loginResult)) {
        $this->logMessage('FTP connection has failed!',true);
        $this->logMessage('Attempted to connect to ' . $server . ' for user ' . $ftpUser, true);
        return false;
    } else {
        $this->logMessage('Connected to ' . $server . ', for user ' . $ftpUser);
        $this->loginOk = true;
        return true;
    }
}

和下载文件如下:

 public function downloadFile($fileFrom,$fileTo) {
    $asciiArray = array('txt','csv');
    $extension = end(explode('.',$fileFrom));

    if(in_array($extension,$asciiArray)) {
        $mode = FTP_ASCII;
    } else {
        $mode = FTP_BINARY;
    }

    if(ftp_get($this->connectionId,$fileTo,$fileFrom,$mode,0)) {
        $this->logMessage("file " . $fileTo . " successfully downloaded");
        return true;
    } else {
        $this->logMessage("There as an error downloading file " . $fileTo,true);
        return false;
    }
}

我通过Active Directory角色管理对我的应用程序的安全访问(这全部在公司内部网上)但请注意,ftp用户名和密码不依赖于这些角色。

这是我遇到的问题。如果任何服务器管理员尝试获取,保存在我的服务器上并显示,它可以正常工作。如果一些不是管理员的用户尝试这样做,那么它可以正常工作,但MOST用户无法完全执行。由于用户必须将文件写入图像文件夹(在上面的路径中看到),因此我将该文件夹共享为我访问所需的Active Directory角色,并为其提供读写权限。文件夹中。

返回的错误是:

  

警告:ftp_get(C:/inetpub/wwwroot/IRIS/images/041351W0006010251F00000064I04.jpg):无法打开流: C:\ inetpub \ wwwroot \ dred \中的权限被拒绝ftp_class.php 在线 113
  
  警告:ftp_get():在 C:\ inetpub \ wwwroot \ dred \ ftp_class.php 中打开C:/inetpub/wwwroot/IRIS/images/041351W0006010251F00000064I04.jpg时出错 113

第113行是ftp_get所在的行(见上文)。

我在故障排除方面做了一些尝试:

  1. 让Active Directory角色管理员写入我的服务器(不是我要保留的东西,只是试验):这有效
  2. 授予Active Directory角色对服务器c-drive的完全读/写/更改权限(再次,仅测试),以及inetpub和wwwroot:无法正常工作
  3. ftp_pasv()设置为True:无法正常工作
  4. 我认为是这样的!任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

经过数小时的故障排除后,我发现了这个问题。正如问题中所提到的,目标是将图像FTP映射到本地服务器上的图像文件夹,以便它们可以嵌入到网页中。通过Windows文件资源管理器,我试图通过基于AD角色共享文件夹来提供对此文件夹的写入权限。这还不够。

解决问题的方法是使用“系统属性”下的“安全”选项卡,并将定义的图像文件夹的写访问权提供给IIS_IUSRS。一旦到位,FTP进程可以将图像写入图像文件夹。