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 указывает, что соединение было сброшено узлом).
Я не могу помочь вам с самой проблемой, но сообщение об ошибке, по-видимому, "Сброс соединения по пиру".
See also: