IIS7 拒绝分块编码文件上传

2024-01-12

我有一个 Windows/Apache2/PHP 应用程序,它使用分块编码接收文件。原因是,file上传是动态的,传输前不知道其长度。这一直开箱即用,效果很好。

现在我需要将应用程序移植到 IIS7/PHP。 问题是 IIS 无法接收分块文件:上传文件时,服务器根本没有响应。我该如何解决这个问题?

请注意,在我的测试中,我什至没有使用 PHP。我只是有一个 .php 扩展名,因为 IIS 拒绝对 .htm 文件进行 POST(这是有道理的)。

正如鲁佩洛在这个答案中所建议的那样 https://stackoverflow.com/questions/338624/why-does-iis-not-support-chunked-transfer-encoding/1208775#1208775,我用 cURL 进行了测试,以确保我的客户端没有损坏。 cURL 也无法得到答案,尽管如果传输没有分块,一切都可以正常工作。

我做了以下测试:

测试.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 "upf[email protected] /cdn-cgi/l/email-protection" 
   -H "Transfer-Encoding: chunked" -H "Expect:"

Note: -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

问题:服务器没有返回任何内容。服务器看起来一直在等待。卷曲不返回。

没有块编码的相同命令按预期工作:

Sent:

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"

IIS 7(至少 IIS 7.5)确实支持分块文件上传。 当块长度错误时,IIS 返回 Http 错误 400:请求中的内容长度或块长度无效。 (例如添加时替换

5 
hello 

with

5
h ello 

问题在于 CGI 调用从 IIS 转移到 PHP。 IIS 似乎并不是 PHP 作为(快速)CGI 无法处理分块文件上传的唯一环境。 看PHP 错误 ID 60826 https://bugs.php.net/bug.php?id=60826

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IIS7 拒绝分块编码文件上传 的相关文章

  • XML 和 INI 哪个更快?

    我想知道 XML 是否比 INI 更快 反之亦然 我正在开发一个包含许多文件的网站 这个问题与我的问题有关关于包含许多文件 https stackoverflow com questions 7777522 too many include
  • en_CA 语言环境中 sprintf 中的逗号作为小数分隔符

    是否可以在 en CA 语言环境中的 sprintf 中使用逗号作为小数点分隔符 sprintf 能够识别区域设置 并且将始终使用当前的区域设置 但您可以使用数字格式 http php net manual en function numb
  • PHP:switch 与 if [重复]

    这个问题在这里已经有答案了 哪种形式更有效率 这个 switch var case 1 break case 2 break 或者这个 if var 1 elseif var 2 在性能方面 性能方面完全无关 As PHPBench htt
  • bash.sh 运行 cron 的权限被拒绝

    如何在这里使用 bash 脚本运行 cron 我做了如下操作 这里有错误 我想知道如何在 ubuntu 中做到这一点 我现在对它感到震惊 bash sh 文件 bin bash cd var www Controller usr bin p
  • 开发中的 Laravel 和视图缓存——无法立即看到变化

    我和一些朋友决定开始一个项目 我们偶然发现了 Laravel 并认为它可能是一个很好的工具 我们开始在本地使用它来开发一些页面 并注意到一些奇怪的事情 当我们用不同的信息更新视图时 大约需要 5 到 10 分钟视图信息才会发生变化 这就像
  • 将变量从 PHP 发送到 Javascript

    我在两个单独的文件中有以下代码 其中一个是 javascript 另一个是 php JavaScript xmlhttp new XMLHttpRequest xmlhttp onreadystatechange function if t
  • Laravel 中的发布请求 - 错误 - 419 抱歉,您的会话/419 您的页面已过期

    我安装了 Laravel 5 7 向文件添加了一个表单 resources views welcome blade php
  • 将视图加载到变量中

    有什么方法可以将 PHP 文件的内容放入变量中吗 我想做这个 msg this gt load gt view some view 但当我这样做时 msg is NULL 是否可以 有可能的 msg this gt load gt view
  • Google BigQuery 与 PHP 集成

    我需要帮助将 google bigquery 代码集成到 PHP 中 所以我可以从 php 代码本身执行查询和其他类型的操作 需要您的帮助并建议我一些工作示例链接 提前致谢 这是一段代码 正确地创建一个Google Client using
  • 如何通过传递国家代码或国家名称在php中获取时区

    我使用一些 api 有国家代码和国家名称 有什么方法可以在 php ini 中获取给定国家代码和国家名称的时区 我有这样的数据 address Object city continent Asia continent code AS cou
  • 使用 Azure AD 身份验证保护的 WebAPI 无法在 IIS 上工作,但在使用 Visual Studio 的 IIS Express 上工作正常

    我正在开发一个使用 Asp Net WebAPI 调用的 AnguarJS SPA 应用程序 我已在 Azure AD 上注册了客户端和后端应用程序 我的客户端 Web 应用程序已注册 详细信息如下 登录网址 http 本地主机 93 ht
  • PHP 中 glob() 中的转义空格?

    我在 PHP 中有以下函数 除了名称中带有空格的文件外 该函数运行良好 Good picture jpg例如 这里是 function getphotolist currentalbum photos glob currentalbum J
  • SESSION 中存储的数组后面出现数字

    我正在对存储在会话变量上的数组执行 print r 由于某种未知的原因 它在数组打印后添加了一个数字 Example Array 0 gt 868 userid gt 868 1 如果我直接在函数本身中执行 print r 并且在变量存储在
  • 将行分组在一列上并与其他列形成嵌套子数组

    这是我试图处理的事情 我的数组看起来像这样并且有重复项 products product name gt Adidas1 address gt street 2 product name gt Adidas2 address gt stre
  • Symfony - 自定义验证器和依赖注入

    我正在尝试对自定义验证器使用依赖项注入 以便能够使用实体管理器 我遵循 Symfony 示例 依赖注入 http symfony com doc current cookbook validation custom constraint h
  • 如何使用多个Auth组件?

    我使用用户模型将身份验证组件配置为 管理页面 但现在 我还想为客户端创建 配置身份验证 我尝试 重写 inialize This is in my ClientsController php public function initiali
  • 如何获取PHP版本?

    有没有办法检查从该脚本中执行特定脚本的 PHP 版本 例如 下面的代码片段 version way to get version print version 将在一台机器上打印 5 3 0 在另一台机器上打印 5 3 1 version p
  • 更新 xampp 中的 ICU 扩展吗?

    我在跑xampp我需要升级ICU php intl 扩展 到最新版本 我下载了54从 ICU 页面 但不确定如何升级它 有一个bin include and lib文件夹 我应该把这些文件放在哪里 我还需要做其他事情吗 要升级 XAMP 安
  • php平台安装询问我intl扩展,但似乎已经安装

    在 orocrm 安装期间 使用 symfony 2 开发的平台 我收到此错误 Fatal error Uncaught exception Symfony Component Intl Exception MethodArgumentVa
  • 通过jquery ajax()和serialize()提交html表单

    我想通过 jquery ajax 提交此表单 这是我所做的 但它不起作用 即表单正在提交并刷新页面 但我没有看到响应 即在同一页面上打印数组 HTML

随机推荐