我有一个在Windows/Apache2/PHP环境下使用分块编码接收文件的应用程序。原因是上传的文件是动态生成的,传输前其长度未知。这一直可以直接使用。
现在我需要将该应用程序移植到IIS7/PHP上。问题在于IIS无法接收分块文件:当文件被上传时,服务器根本没有响应。怎么解决这个问题?
请注意,在我的测试中,我甚至没有使用PHP。我只是使用了.php扩展名,因为IIS拒绝在.htm文件上进行POST请求(这很合理)。
如rupello在此答案中建议的,我使用cURL进行测试以确保客户端没有问题。尽管如果传输不是分块的话一切都正常,但cURL也无法获得答案。
我进行了以下测试:
test.php:
这个命令没有返回结果(一直等待答案)。
注意:使用
问题:服务器没有返回任何内容,看起来像是一直等待。curl没有返回结果。
同样的命令如果不使用分块编码,则可以正常运行:
发送的内容:
现在我需要将该应用程序移植到IIS7/PHP上。问题在于IIS无法接收分块文件:当文件被上传时,服务器根本没有响应。怎么解决这个问题?
请注意,在我的测试中,我甚至没有使用PHP。我只是使用了.php扩展名,因为IIS拒绝在.htm文件上进行POST请求(这很合理)。
如rupello在此答案中建议的,我使用cURL进行测试以确保客户端没有问题。尽管如果传输不是分块的话一切都正常,但cURL也无法获得答案。
我进行了以下测试:
test.php:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
</head>
<body>
<form method="post" enctype="multipart/form-data">
File: <input type="file" name="upfile" />
<input type="submit" value="go"/>
</form>
</body>
</html>
这个命令没有返回结果(一直等待答案)。
curl.exe http://serveur/test.php --form "upfile=@text.txt"
-H "Transfer-Encoding: chunked" -H "Expect:"
注意:使用
-H "Expect:"
可以抑制curl发出的Expect 100-Continue
请求。没有这个头部信息,结果是一样的,只是会多一次往返通信。POST http://serveur/test.php HTTP/1.1
User-Agent: curl/7.15.3 (i586-pc-mingw32msvc) libcurl/7.15.3 zlib/1.2.2
Host: serveur
Pragma: no-cache
Accept: */*
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: multipart/form-data; boundary=----------------------------310dbcc6761b
8c
------------------------------310dbcc6761b
Content-Disposition: form-data; name="upfile"; filename="text.txt"
Content-Type: text/plain
5
hello
30
------------------------------310dbcc6761b--
0
问题:服务器没有返回任何内容,看起来像是一直等待。curl没有返回结果。
同样的命令如果不使用分块编码,则可以正常运行:
发送的内容:
POST http://serveur/test.php HTTP/1.1
User-Agent: curl/7.15.3 (i586-pc-mingw32msvc) libcurl/7.15.3 zlib/1.2.2
Host: serveur
Pragma: no-cache
Accept: */*
Connection: Keep-Alive
Content-Length: 193
Content-Type: multipart/form-data; boundary=----------------------------e2d761bc173a
------------------------------e2d761bc173a
Content-Disposition: form-data; name="upfile"; filename="text.txt"
Content-Type: text/plain
hello
------------------------------e2d761bc173a--
服务器现在能正确地回复:
HTTP/1.1 200 OK
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.8
X-Powered-By: ASP.NET
Date: Mon, 21 Nov 2011 10:47:57 GMT
Content-Length: 272
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
</head>
<body>
<form method="post" enctype="multipart/form-data">
File: <input type="file" name="upfile" />
<input type="submit" value="go"/>
</form>
</body>
</html>
使用相同文件和请求在普通的LAMP服务器上测试运行良好。
那么,我该如何在IIS上启用请求分块编码?
注意:我确实尝试了相关的ASP参数,但无济于事:
C:\...\inetsrv>appcmd.exe set config /section:asp /enableChunkedEncoding:True
Applied configuration changes to section "system.webServer/asp" for "MACHINE/
WEBROOT/APPHOST" at configuration commit path "MACHINE/WEBROOT/APPHOST"