IIS7 отказывается от загрузки фрагментированного файла - PullRequest
5 голосов
/ 21 ноября 2011

У меня есть приложение для Windows / Apache2 / PHP, которое получает файл, используя кусочную кодировку.Причина в том, что загруженный файл является динамическим, а его длина неизвестна до передачи.Это всегда работало нормально из коробки.

Теперь мне нужно портировать приложение на IIS7 / PHP.Проблема заключается в том, что IIS не может получить файл с фрагментами: при загрузке файла сервер просто не отвечает вообще.Как мне решить эту проблему?

Обратите внимание, что в моем тесте я даже не использую PHP.У меня просто есть расширение .php, потому что IIS отказывается от POST для файла .htm (что имеет смысл).

Как подсказал 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:" предназначен для подавления Expect 100-Continue, выдаваемого 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
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"

Ответы [ 2 ]

3 голосов
/ 04 апреля 2012

IIS 7 (по крайней мере, IIS 7.5) поддерживает загрузку фрагментированных файлов. Если длина порции неверна, IIS возвращает ошибку HTTP 400: в запросе указана недопустимая длина контента или длина порции. (например, заменить при добавлении

5 
hello 

с

5
h ello 

Проблема заключается в переводе вызова CGI из IIS в PHP. IIS, похоже, не является единственной средой, для которой PHP как (быстрый) CGI не может справиться с частичной загрузкой файлов. См. PHP-ошибка ID 60826

0 голосов
/ 26 января 2012

Согласно HTTP 1.1 spec , кодированная часть определяется как серверная кодировка - т.е. сервер отправляет ответ в такой кодировке, а не наоборот ( Wiki Страница тоже говорит то же самое).Нет никакого упоминания о том, что Сервер принимает запрос в виде чанкованного фрагмента, поэтому он не реализован в IIS.

Сказав это, кажется, что APACHE реализовал это, находясь вне спецификации HTTP.

...