IIS+php服务器无法上传图片解决办法

IIS+php教程服务器无法上传图片解决办法

服务器上使用Apache2+PHP正常运行,换成IIS+PHP,先后出现了php.ini的环境变量无法读取,php中验证码无法显示的问题,如今又有人反应无法上传图片的问题。

   从IIS替换Apache2的过程仅仅是开启IIS,关闭Apache2,其它的没什么变化,但是却发生了如此多的差异,看样子IIS支持PHP还是有很多要进行修改的。

分析:

   根据上面的描述,我怀疑问题出在IIS的权限配置上,IUSR_MACHINE的帐户对upload没有写入的权限,于是进行权限修改,IIS下的权限,NTFS下的权限都进行修改,但是终究都没用,查找网络上的资料也没有相应的,对上传页面进行测试,流程为:

   swf文件调用save.php上传文件---->swf文件对上传的文件进行重命名--->名字返回给save.php--->显示出最后的名字。

   现在的问题一直停留在swf对文件重命名的这里,一直没有到显示出最后的名字,并且swf文件不参与上传过程,那就只能在save.php文件中进行问题查找了,在该文件中进行测试,最后显示的名字所使用的变量为fileName,于是插入下面的语句进行测试:

   echo "fileName=2008*****.gif";

   这句话的作用就是使得fileName有值,save.php能正常显示,先把原来的语句一句一句的进行屏蔽测试,都正常的返回了,但是当测试到:
    if (!@move_uploaded_file($f["tmp_name"], $dest_dir.'/'.$fileName)) header("HTTP/1.0 404 Not Found");
   这句话的时候问题出现了,不能上传,查找上下文,一直没发现tmp_name的变量,不过看意思是先把文件上传到一个临时文件,再挪动到目的位置,那这个tmp位置在哪里呢?是不是这个位置不可写,才导致了无法上传文件?

   查找网上资料,发现php.ini下面有2个地方关于上传的配置:
file_uploads = On                          这里设置是否允许HTTP上传,默认应该为ON的
   ;upload_tmp_dir=                          这里设置上传文件存放的临时位置

网上对于这2个地方的相关资料有:
I try to set up file uploading under IIS 7 and PHP 5.

First problem was to set 2 variables in php.ini

file_uploads = On           //这里是说php.ini文件这个地方设置成On

upload_tmp_dir = "C:Inetpubwwwrootuploads"    //这个路径就是自己设置的上传文件临时存储路径

For some reasons such directory name works,
but "upload_tmp" won't work.

The second problem was to set correct user rigths for upload folders where you try to save your file. I set my upload folder rights for the "WORKGROUP/users" for the full access. You may experiment by yourselves if you not need execute access, for example.

    我的php.ini中upload_tmp_dir是被注释的,没有启用,更没有设置,可是为什么Apache2却可以正常上传呢?难道问题真的出在这里?

解决:

   新建一个文件夹做临时上传目录,按照上面的英文说明修改php.ini中相应的那2项,把临时上传目录upload_tmp_dir设置成刚才建立的文件夹,把该文件夹的权限赋予“IUSR_计算机名”用户可写,重新启动IIS,上传试试,问题真的就这样解决了。

最终的分析答案:

   上面的内容写于09年,但是现在2010年7月我新增一台服务器,又出现了这个问题,同时再次按照上面的解决方法实施,在操作的过程中大概是由于哪里出了错,竟然没有成功,不得不抽出点时间来研究具体原因,找到了最终产生这个问题的原因如下。
    无法上传文件,不代表所有文件都无法上传,因为我的一个网站,flash调用fwrite()传头像之类的成功了,但是调用@move_uploaded_file($f["tmp_name"], $dest_dir.'/'.$fileName)这样的函数传照片的时候仍旧无法上传。
   经过我的分析,原因是由于fwrite()是传的二进制文件,而move_uploaded_file()传的是文本文件,而windows操作系统是区分这2种文件的 [参考php手册fwrite()函数的说明],这也就是说这2种不同的文件在php环境下上传时所存储的临时上传目录是不同的,由于在配置IIS环境下的PHP的时候,设置的临时目录为E:tmp,设置该目录的iusr用户可写,二进制文件即可上传,所以我怀疑该目录就是二进制文件上传临时文件的存储位置,那么move_uploaded_file()传的文本文件的临时文件存储位置在哪里呢?其实就是在上面的那段英文里面,upload_tmp_dir设置的路径就是了,但是我的几台服务器中,每台服务器的这个设置的值都是被注释掉的“no value”,为什么有的服务器可以上传,而有的服务器不可以上传呢?这也就回到了以前我提出的问题,为什么Apache2可以上传而iis不可以上传呢?
    这次我再次分析upload.php文件,分析其中造成该故障的代码具体内容如下:

// 检查是否有文件上传
    if (! $_FILES['upload'.$num]['name'] == ""){
      if ($_FILES['upload'.$num]['size'] < $max_size) { 
   1、 echo "文件上传路径:".$location.$_FILES['upload'.$num]['name'];
    2、echo "文件临时文件名:".$_FILES['upload'.$num]['tmp_name'];
    3、    move_uploaded_file($_FILES['upload'.$num]['tmp_name'],$location.$_FILES['upload'.$num]['name']) or $event = "Failure";
    } else {
     $event = "File too large!";
    }

   其中正常代码中第2句是不存在的,为了测试方便我加上来的,它的主要目的就是测试我的php.ini没有设置upload_dir_tmp的值的时候,上传的文件临时保存在哪里的,经过这个测试发现原来在不配置php.ini的upload_dir_tmp的值的时候,默认的存储位置是在 C:windowstemp目录,并且临时文件是以.tmp为后缀存储的,该文件马上就会被删除,所以你想通过操作系统的文件修改搜索功能是无法找到的,也就无法找到upload_dir_tmp的默认路径是哪里。

   既然找到了upload_dir_tmp的默认路径了,那么修改c:windowstemp的访问权限,赋予IUSR_用户可写,重启动IIS Admin服务,上传文件,终于成功了。这就是为什么我的多台服务器upload_dir_tmp的值都为空的时候有的可传,有的不可传的原因。

时间: 2024-09-13 05:26:21

IIS+php服务器无法上传图片解决办法的相关文章

卸载ZkeysPHP 后iis网站出现Service Unavailable 解决办法_win服务器

ZkeysPHP确实不错,使用比较简单,很方便新手使用,使用以后建议再找专业的安全设置团队给设置下比较好,windows下本了漏洞就多,80%的网站有后门的情况来看,就算手工配置不安全设置也会出现问题. 解决办法: 1.删除iis 网站属性的isapi筛选器里面的 .php 2.给NETWORK SERVICE 加上访问iis服务的权限,具体方法如下: 点击"开始"-"控制面板"-"管理工具"-"组件服务"-"计算机

IIS提示Service Unavailable错误解决办法

问题一 . 现象描述 1)访问网站出现"Service Unavailable"错误 2)查看IIS中的应用程序池出现被自动禁用情况 3)计算机管理 - 系统工具 - 事件查看器 - 应用程序:出现错误(来源:.NET Runtime 2.0,类型:错误,事件ID :1000,描述:Faulting application w3wp.exe, version 6.0.3790.3959, stamp 45d6968e, faulting module kernel32.dll, ver

关于ADSL用户80端口被封WEB服务器的临时解决办法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 近期全国都在查WAP,查备案,很多站长朋友所处地区已全面封禁80端口,对于本地架设网站的站长朋友们,带来不小的损失,这里跟大家说一下临时的解决办法. 1,网站改其它端口,如81 2,修改原别名解析的主域名,如原来www 指向的花生壳或者每步域名,改www为go 3,增加一条URL转发,www转发至 go.***.com:81 隐藏转发,或者不

iis出现Server Application Error 解决办法

server application error the server has encountered an error while loading an application during the processing of your request. please refer to the event log for more detail information. please contact the server administrator for assistance. 访问iis客

服务器安全狗4.2远程桌面保护导致服务器无法访问解决办法

注意:服务器安全狗4.2远程桌面保护存在这个问题了,只要开启了远程桌面就会导致服务器不能访问及不能远程登录了,这个问题官方没有给具体的解决办法. 解决办法一 1.关闭远程桌面登录了,这个不推了会导致服务器安全不够了 2.使用服务器安全狗4.1版本了,这个版本小编用有蛮久了没有碰到这类问题,出现远程桌面保护导致服务器无法访问是在安全狗4.2版本了.

IIS 应用程序池自动关闭的解决办法_win服务器

解决过程: 开始时以为是IIS的问题.重装N次后,问题依然.看事件日志,提示如下: 事件类型: 警告 事件来源: W3SVC 事件种类: 无 事件 ID: 1009 日期: 2007-7-11 事件: 14:57:47 用户: N/A 计算机: GHITR-61969D77E 描述: 为应用程序池 事件类型: 错误 事件来源: DCOM 事件种类: 无 事件 ID: 10016 日期: 2007-7-11 事件: 14:57:47 用户: NT AUTHORITY\NETWORK SERVICE

win2003 sp2 安装iis提示无法复制文件解决办法[已测]_win服务器

问题解决方法: 1,最后是在没有打sp2补丁下就安装iis,就不会提示无法复制文件了. 2,假如已要打上了sp2补丁安装iis,出现提示无法复制文件的时候 (1),给他一个路径是windwos/system32里面试试(一般情况下可以找到) (2),如果不行的话就点击开始->运行->  复制代码 代码如下: esentutl /p %windir%/security/database/secedit.sdb 然后会有一个警告框,确定就可以了. 总结,据查是因为microsoft的win2003

IIS不支持ASP的解决办法

iis|解决 500问题终于解决了,这二周来服务器一直在出问题,上次是耗尽CPU100%资源,这次又是500错误: Server Application ErrorThe server has reached the maximum recovery limit for the application during the processing of your request. Please contact the server administrator for assistance. ---

IIS配置401错误完美解决办法

iis|错误|解决 1.错误号401.1 症状:HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝. 分析: 由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无法访问. 解决方案: (1)查看IIS管理器中站点安全设置的匿名帐户是否被禁用,如果是,请尝试用以下办法启用: 控制面板->管理工具->计算机管理->本地用户和组,将IUSR_机器名账号启用.如果还没有解决,请继续下一步. (2)查看本地安全策略中,IIS管理器中站点的默