PHP / CURL / ASP.NET / C# - отправка файлов размером более 9 МБ

Я хочу отправить файл из PHP (v5.4) через CURL в 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>

Когда я выполняю сценарий с файлом размером более 9 МБ (также, например, с двумя 5-МБ-файлами), я получаю следующий результат через несколько минут в зависимости от размера файла:

ErrorMsg: SSL read: error:00000000:lib(0):func(0):reason(0), errno 10054
ErrorNr.:56

Когда я перехожу на файл размером 9 Мб или меньше, все работает нормально.

Также: я получаю ту же ошибку при вызове CURL из cmd (Windows 7):

curl --form upload=@myfile.jpg --form press=OK https://localhost:44303/api/v1/File -k -sslv3 

=> Все происходит на моей локальной машине, так что нет брандмауэра и vpn.

Я пробовал несколько комбинаций параметров, но я не делаю никакого прогресса. На самом деле это скорее гадание, чем реальное тестирование. Может быть, есть одна маленькая вещь, которую я все время упускаю из виду?

Заранее большое спасибо!

3 ответа

Решение

Подумав почти один день, у меня появилась идея просто опубликовать часть asp.net на веб-сайте Azure, поскольку это может быть проблемой моей локальной конфигурации.

Когда я это опубликовал, мне пришлось удалить эту строку из моей конфигурации php curl:

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

С веб-сайта Azure я теперь могу загружать большие файлы - так, как и должно быть.

Я пытался понять, почему он работает на Azure, а не на localhost, но на самом деле я еще не нашел ответа. Похоже, некоторые проблемы конфигурации IIS Express и Visual Studio 2013. Может быть, это кому-то помогает.

Это ограничение загрузки только 9 МБ может быть вызвано использованием защищенного URL-адреса https вместо незащищенного URL- адреса http.

Так что в скрипте 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 указывает, что соединение было сброшено узлом).

Другие вопросы по тегам