PHP cURL上传文件至IIS服务器返回500错误(错误码0x80070026)
解决IIS 7.5下PHP cURL上传文件返回500(0x80070026)的问题
从你描述的场景来看,问题核心是PHP cURL发送的multipart/form-data请求(带文件)在IIS 7.5上解析失败,但Apache和Postman都能正常处理。结合错误码0x80070026以及IIS日志的500 0 38(对应ERROR_HANDLE_EOF,即请求解析时遇到意外的文件结束符),可以从以下几个方向排查解决:
1. 为curl_file_create指定明确的MIME类型
Postman在上传文件时会自动为文件添加正确的Content-Type头,但PHP的curl_file_create默认不会指定MIME类型,这可能导致IIS的PHP解析器无法正确识别文件字段。修改你的文件上传代码:
$postData = array( 'scanDate' => date('Y-m-d H:i:s'), // ...其他数据 // 明确指定文件的MIME类型,这里用application/octet-stream适配多数文件类型,也可以用stl对应的application/sla 'file1' => curl_file_create('file1.stl', 'application/octet-stream', 'file1.stl'), 'file2' => curl_file_create('file2.stl', 'application/octet-stream', 'file2.stl') );
2. 手动指定multipart请求的边界符
cURL自动生成的边界符可能包含IIS解析器不兼容的特殊字符,导致请求边界识别失败。你可以手动指定一个简洁的边界符,并显式设置Content-Type头:
// 生成一个无特殊字符的边界符 $boundary = '----PHPFormBoundary' . uniqid(); // 保持postData不变(已修改curl_file_create的部分) $postData = array( 'scanDate' => date('Y-m-d H:i:s'), // ...其他数据 'file1' => curl_file_create('file1.stl', 'application/octet-stream', 'file1.stl'), 'file2' => curl_file_create('file2.stl', 'application/octet-stream', 'file2.stl') ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_USERPWD, $username . ':' . $password); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); // 手动设置带指定边界的Content-Type curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type: multipart/form-data; boundary=$boundary" )); $result=curl_exec($ch);
3. 调整IIS和PHP的上传大小限制
IIS 7.5默认的最大请求内容长度较小,若文件总大小超过限制会直接返回500错误:
- IIS端:打开IIS管理器 → 找到对应站点 → 双击「请求筛选」→ 右侧「编辑功能设置」,将「最大允许的内容长度(字节)」调整为足够大的值(比如104857600,即100MB)。
- PHP端:修改服务器上的
php.ini,调整以下参数:
修改后重启IIS和PHP服务生效。upload_max_filesize = 100M post_max_size = 100M max_execution_time = 300
4. 检查FastCGI配置(IIS+PHP的常见坑)
PHP在IIS上通常通过FastCGI运行,若FastCGI配置不当也会导致multipart请求失败:
- 打开IIS管理器 → 服务器节点 → 「FastCGI设置」→ 找到对应的PHP条目 → 右键「编辑」
- 确保
PHP_FCGI_MAX_REQUESTS设置足够大(比如1000),避免频繁重启进程导致请求中断 - 调整「请求超时」为足够长的时间(比如300秒),适配文件上传的耗时
5. 开启PHP错误日志定位具体问题
如果以上方法都无效,开启服务器端PHP的错误日志,能直接看到PHP处理请求时的具体错误,而不是只看到IIS的500提示:
修改php.ini:
log_errors = On error_reporting = E_ALL error_log = "C:\Windows\Temp\php_upload_errors.log"
上传测试后查看日志文件,能精准定位是文件写入权限、解析错误还是其他问题。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

