我一直在搜索有关此错误的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
所在的行(见上文)。
我在故障排除方面做了一些尝试:
ftp_pasv()
设置为True:无法正常工作我认为是这样的!任何建议都将不胜感激。
答案 0 :(得分:1)
经过数小时的故障排除后,我发现了这个问题。正如问题中所提到的,目标是将图像FTP映射到本地服务器上的图像文件夹,以便它们可以嵌入到网页中。通过Windows文件资源管理器,我试图通过基于AD角色共享文件夹来提供对此文件夹的写入权限。这还不够。
解决问题的方法是使用“系统属性”下的“安全”选项卡,并将定义的图像文件夹的写访问权提供给IIS_IUSRS。一旦到位,FTP进程可以将图像写入图像文件夹。