5

チャンクエンコーディングを使用してファイルを受信するWindows/Apache2/PHPアプリがあります。その理由は、アップロードされたファイルが動的であり、転送前にその長さがわからないためです。これは、箱から出してすぐに正常に機能します。

次に、アプリをIIS7/PHPに移植する必要があります。問題は、IISがチャンク化されたファイルの受信に失敗することです。ファイルがアップロードされると、サーバーはまったく応答しません。どうすればこれを解決できますか?

私のテストでは、PHPも使用していないことに注意してください。IISが.htmファイルへのPOSTを拒否するため、私は単に.php拡張子を持っています(これは理にかなっています)。

この回答で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:"

注:curlによる発行-H "Expect:"を抑制します。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

問題:サーバーから何も返されません。サーバーは待機し続けているようです。カールは戻りません。

チャンクエンコーディングを使用しない同じコマンドは、期待どおりに機能します。

送信済:

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"
4

2 に答える 2

4

IIS 7(少なくともIIS 7.5)は、チャンクされたファイルのアップロードをサポートします。チャンクの長さが間違っていると、IISはHttpエラー400を返します。リクエストに無効なコンテンツの長さまたはチャンクの長さがあります。(たとえば、追加するときに置き換える

5 
hello 

5
h ello 

問題は、IISからPHPへのCGI呼び出しの転送にあります。PHP as(Fast)CGIがチャンク化されたファイルのアップロードを処理できない環境はIISだけではないようです。PHP-バグID60826を参照してください

于 2012-04-04T06:34:24.757 に答える
0

HTTP 1.1仕様によれば、チャンクエンコーディングはサーバーエンコーディングとして定義されています。つまり、サーバーはそのようなエンコーディングで応答を送信しますが、その逆ではありません(Wikiページにも同じことが記載されています)。サーバーがチャンク化されたエンコードされた要求を受け入れることについては言及されていないため、IISには実装されていません。

そうは言っても、APACHEはHTTP仕様の範囲外でこれを実装しているようです。

于 2012-01-26T17:12:53.323 に答える