PHP / CURL / ASP.NET / C# - 发送大于9mb的文件

时间:2015-03-02 15:47:44

标签: c# php asp.net curl file-upload

我想通过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 

=&GT;一切都发生在我的本地机器上,所以没有防火墙,也没有vpn。

我尝试了多种参数组合,但我没有取得任何进展。实际上它比实际测试更具猜测性。也许我一直忽略了一件小事?

提前多多感谢!

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

在猜测了将近一天之后,我想到了将asp.net部分发布到Azure网站,因为这可能是我本地配置的问题。

正如我发布的那样,我不得不删除这行php curl配置:

//curl_setopt($ch, CURLOPT_SSLVERSION, 3); 

使用Azure网站,我现在可以上传更大的文件 - 就像它应该的那样。

我试图理解为什么它在Azure上工作但不在localhost上 - 但实际上我还没有找到答案。看起来像IIS Express和Visual Studio 2013的一些配置问题。也许这有助于某人。

答案 2 :(得分:0)

使用安全的 https 网址而不是非安全的 http 网址,可能会导致上传仅9MB的限制。

所以在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时,上传实际上会在不到十秒的时间内停止,如卷曲进度表中所示。在此之后几分钟关闭连接,给出错误的外观,即服务器中存在实际问题(错误代码56表示连接已由对等方重置)。