PHP / CURL / ASP.NET / C# - 发送大于 9mb 的文件
PHP / CURL / ASP.NET / C# - Send files bigger than 9mb
我想通过 CURL 从 PHP (v5.4) 发送文件到 ASP.NET WebApi (C#)。我认为这应该很容易,但我遇到了一些我无法解释的奇怪行为:
php 脚本:
<?php
$files = array();
$files['file_content'] = '@'.realpath('./myfile.jpg');
$url = 'https://localhost:44307/api/v1/File';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, trim($url));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOPROGRESS, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// ignore ssl verifyer
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_exec($ch);
echo 'ErrorMsg: '.curl_error($ch).'<br>';
echo "ErrorNr.:".curl_errno($ch).'<br>';
curl_close($ch);
?>
php.ini:
upload_max_filesize = 1024M
max_file_uploads = 20
memory_limit = 1024M
post_max_size = 1024M
Web.config:
<system.web>
<httpRuntime executionTimeout="1800" maxRequestLength="2097152" requestValidationMode="2.0" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648" />
</requestFiltering>
</security>
</system.webServer>
当我使用大于 9mb 的文件(例如还有两个 5mb 文件)执行脚本时,根据文件的大小,我在几分钟后得到以下结果:
ErrorMsg: SSL read: error:00000000:lib(0):func(0):reason(0), errno 10054
ErrorNr.:56
当我更改为 9mb 或更小的文件时,一切正常。
另外:从 cmd (Windows 7) 调用 CURL 时,我遇到了同样的错误:
curl --form upload=@myfile.jpg --form press=OK https://localhost:44303/api/v1/File -k -sslv3
=> 一切都发生在我的本地机器上,所以没有防火墙也没有 vpn。
我尝试了多种参数组合,但没有任何进展。实际上,它比实际测试更多的是猜测。也许我一直忽略了一件小事?
非常感谢!
我无法帮助您解决问题本身,但错误消息显然是 'Connection reset by peer'。
See also:
- PHP CURL Error - curl: (56) Recv failure: Connection reset by peer
- CURL ERROR: Recv failure: Connection reset by peer - PHP Curl
- docker Mule-server curl: (56) Recv failure: Connection reset by peer
经过将近一天的猜测后,我有了将 asp.net 部分发布到 Azure 网站的想法,因为这可能是我本地配置的问题。
在我发布它时,我不得不删除 php curl 配置的这一行:
//curl_setopt($ch, CURLOPT_SSLVERSION, 3);
借助 Azure 网站,我现在可以上传更大的文件 - 就像它应该的那样。
我试图理解为什么它在 Azure 上工作而不在本地主机上工作 - 但实际上我还没有找到答案。看起来像是 IIS express 和 Visual Studio 2013 的一些配置问题。也许这对某人有帮助。
上传只有 9MB 的限制可能是由于使用安全的 https URL 而不是不安全的 http URL.
所以在 php 脚本中,您应该将第 5 行更改为:
$url = 'http://localhost:44307/api/v1/File';
合适的 curl 命令是:
curl --form upload=@myfile.jpg --form press=OK http://localhost:44303/api/v1/File -k -sslv3
使用安全 URL 时,上传实际上会在不到十秒内停止,如 curl 进度表中所示。连接在几分钟后关闭,给人一种错误的印象,即实际问题出在服务器上(错误代码 56 表示连接已被对等方重置)。
我想通过 CURL 从 PHP (v5.4) 发送文件到 ASP.NET WebApi (C#)。我认为这应该很容易,但我遇到了一些我无法解释的奇怪行为:
php 脚本:
<?php
$files = array();
$files['file_content'] = '@'.realpath('./myfile.jpg');
$url = 'https://localhost:44307/api/v1/File';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, trim($url));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $files);
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOPROGRESS, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// ignore ssl verifyer
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_exec($ch);
echo 'ErrorMsg: '.curl_error($ch).'<br>';
echo "ErrorNr.:".curl_errno($ch).'<br>';
curl_close($ch);
?>
php.ini:
upload_max_filesize = 1024M
max_file_uploads = 20
memory_limit = 1024M
post_max_size = 1024M
Web.config:
<system.web>
<httpRuntime executionTimeout="1800" maxRequestLength="2097152" requestValidationMode="2.0" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648" />
</requestFiltering>
</security>
</system.webServer>
当我使用大于 9mb 的文件(例如还有两个 5mb 文件)执行脚本时,根据文件的大小,我在几分钟后得到以下结果:
ErrorMsg: SSL read: error:00000000:lib(0):func(0):reason(0), errno 10054
ErrorNr.:56
当我更改为 9mb 或更小的文件时,一切正常。
另外:从 cmd (Windows 7) 调用 CURL 时,我遇到了同样的错误:
curl --form upload=@myfile.jpg --form press=OK https://localhost:44303/api/v1/File -k -sslv3
=> 一切都发生在我的本地机器上,所以没有防火墙也没有 vpn。
我尝试了多种参数组合,但没有任何进展。实际上,它比实际测试更多的是猜测。也许我一直忽略了一件小事?
非常感谢!
我无法帮助您解决问题本身,但错误消息显然是 'Connection reset by peer'。
See also:
- PHP CURL Error - curl: (56) Recv failure: Connection reset by peer
- CURL ERROR: Recv failure: Connection reset by peer - PHP Curl
- docker Mule-server curl: (56) Recv failure: Connection reset by peer
经过将近一天的猜测后,我有了将 asp.net 部分发布到 Azure 网站的想法,因为这可能是我本地配置的问题。
在我发布它时,我不得不删除 php curl 配置的这一行:
//curl_setopt($ch, CURLOPT_SSLVERSION, 3);
借助 Azure 网站,我现在可以上传更大的文件 - 就像它应该的那样。
我试图理解为什么它在 Azure 上工作而不在本地主机上工作 - 但实际上我还没有找到答案。看起来像是 IIS express 和 Visual Studio 2013 的一些配置问题。也许这对某人有帮助。
上传只有 9MB 的限制可能是由于使用安全的 https URL 而不是不安全的 http URL.
所以在 php 脚本中,您应该将第 5 行更改为:
$url = 'http://localhost:44307/api/v1/File';
合适的 curl 命令是:
curl --form upload=@myfile.jpg --form press=OK http://localhost:44303/api/v1/File -k -sslv3
使用安全 URL 时,上传实际上会在不到十秒内停止,如 curl 进度表中所示。连接在几分钟后关闭,给人一种错误的印象,即实际问题出在服务器上(错误代码 56 表示连接已被对等方重置)。