PHP, das mit IIS unter Windows konfiguriert ist, kann keine Dateien hochladen , was für viele Internetnutzer immer ein verwirrender Punkt war. Ich habe es gesammelt und geklärt, in der Hoffnung, dass es Ihnen helfen kann
Fortsetzung des Artikels „Konfigurieren von PHP mit IIS in Windows Server 2003“
Der Server läuft normal mit Apache2+PHP. Wenn er durch IIS+PHP ersetzt wird, wird die Umgebungsvariable verwendet php.ini erscheint nacheinander und kann nicht gelesen werden. In PHP kann der Bestätigungscode nicht angezeigt werden. Der Prozess des Ersetzens von Apache2 durch IIS besteht lediglich darin, IIS zu öffnen und Apache2 zu schließen. Sonstiges
hat sich nicht viel geändert, aber es scheint, dass es bei IIS noch viele Unterschiede gibt tun, um PHP zu unterstützen.
Analyse:
Laut obiger Beschreibung vermute ich, dass das Problem in der Berechtigungskonfiguration von IIS liegt. Das IUSR_MACHINE-Konto verfügt nicht über Schreibberechtigungen zum Hochladen, daher habe ich die Berechtigungen geändert Legen Sie die Berechtigungen unter IIS fest, ändern Sie die Berechtigungen unter NTFS, aber am Ende gab es keine entsprechenden Informationen bei der Suche nach Informationen im Netzwerk. Der Vorgang lautet: Swf-Dateiaufrufe speichern .php zum Hochladen der Datei----> ;SWF-Datei benennt die hochgeladene Datei um--->Der Name wird an save.php zurückgegeben--->Der Nachname wird angezeigt.
Das aktuelle Problem liegt in der Umbenennung der Datei durch swf. Der Nachname wurde nicht angezeigt und die swf-Datei nimmt nicht am Upload-Vorgang teil, sodass das Problem nur darin zu finden ist save.php-Datei. Testen Sie nun in dieser Datei die Variable
Datei
Name, also fügen Sie zum Testen die folgende Anweisung ein:
echo „Dateiname“. =2008* ****.g
if"; Die Funktion dieses Satzes besteht darin, dafür zu sorgen, dass fileName einen Wert hat und save.php normal angezeigt werden kann. Schützen Sie zunächst die ursprüngliche Anweisung um eins und testen Sie es. Alles ist normal, aber wenn der Test Folgendes erreicht:
if (mailto:!@move_uploaded_file($f[%22tmp_name"], $dest_ dir .'/'.$fileName)) head er("HTTP/1.0 404 Not Found");
Auf der Suche nach Online-Informationen habe ich festgestellt, dass es unter php.ini zwei Stellen für die Upload-Konfiguration gibt: file_uploads = Ein Hier legen Sie fest, ob HTTP-Upload zugelassen werden soll. Die Standardeinstellung sollte EIN sein. ;upload_tmp_dir= Hier , Legen Sie den Upload-Dateispeicher fest. Der temporäre Speicherort von
Die relevanten Informationen zu diesen beiden Orten im Internet sind:
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:\Inetpub\wwwroot\uploads" //这个路径就是自己设置的上传文件临时存储路径 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 right s 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:\windows\temp目录,并且临时文件是以.tmp为后缀存储的,该文件马上就会被删除,所以你想通过操作系统的文件修改搜索功能是无法找到的,也就无法找到upload_dir_tmp的默认路径是哪里。
既然找到了upload_dir_tmp的默认路径了,那么修改c:\windows\temp的访问权限,赋予IUSR_用户可写,重启动IIS Admin服务,上传文件,终于成功了。这就是为什么我的多台服务器upload_dir_tmp的值都为空的时候有的可传,有的不可传的原因。
现在已经修改了IIS使用环境变量方式精简配置php的那篇文章了,因为当时没有注意这个位置的权限设置,造成了如今的问题,不过最终解决也是好的。
Das obige ist der detaillierte Inhalt vonLösung des Problems, dass mit IIS konfiguriertes PHP unter Windows verwendet werden kann, aber keine Dateien hochladen kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!