| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > ошибка 413 Request Entity Too Large при ajax |
| Автор: mstdmstd 28.3.2016, 08:28 | ||||||||
| Всем привет, Есть необходимость загрузить картинку в строковом представлении через ajax - запрос. Делаю:
алерт в самой первой строке выводит
И после паузы получаю ошибку 413 Request Entity Too Large... Длина строки это ~ 16 МБ Открываю и смотрю etc/php.ini :
В phpinfo я вижу : PHP Version 5.5.21 ...
Не подскажите в чем проблема и как ее побороть? Файл, который я пытаюсь записать довольно большой, но явно меньше параметров в конфе. Или это ограничения d ajax-запросе ? Гуглом я не нашел есть ли ограничения в размере для ajax-запроса... |
| Автор: ksnk 28.3.2016, 11:08 |
| В гугле на строку `413 Request Entity Too Large` выводит http://ruhighload.com/post/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0+413+Request+Entity+Too+Large Не оно? Загружать файлы, вообще говоря, проще и правильнее с помощью объекта formData |
| Автор: mstdmstd 28.3.2016, 13:51 | ||
| formData это пример отсюда ? http://stackoverflow.com/questions/6974684/how-to-send-formdata-objects-with-ajax-requests-in-jquery
FormData - не нужно подключть более никаких библитотек и input.files[0] - это текст моей картинки и 'http://example.com/script.php' - скрипт принимающий файл? |
| Автор: ksnk 28.3.2016, 13:59 |
| Да, это он. Единственное ограничение - нужен относительно современный броузер. IE10 минимум... Добавлено через 5 минут и 8 секунд Возможно, вот это пригодится http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata |
| Автор: mstdmstd 29.3.2016, 10:09 |
| Спасибо! Пообщался с сапортом, там ограничения на post_max_size = 24M, хотя у меня и меньшие файлы выдают ошибку, в независимости что написано в php.ini. И решил переделать загрузку сабмитом формы без аджакса - и вопрос, а есть ли удобные утилиты для загрузки больший файлов наподобе FormData, но при сабмите формы? |
| Автор: mstdmstd 29.3.2016, 12:46 | ||
| Да ссылку я посмотрел Саппорт мне ответил:
Упоминания про параметр client_max_body_size в Grid(это такой аналог cPanel) и в phpinfo я не нашел Сапорту я писал про этот параметр но они ответили параметрами выше и видимо эти 24M и есть client_max_body_size? И решил переделать загрузку сабмитом формы без аджакса - и вопрос, а есть ли удобные утилиты для загрузки больший файлов наподобе FormData, но при сабмите формы? |
| Автор: ksnk 29.3.2016, 13:02 | ||
| Саппорт ответил цитатой из php.ini. http://seyferseed.ru/ru/php/bol-shoj-razmer-post-zaprosa-v-php.html
|
| Автор: mstdmstd 29.3.2016, 13:23 |
| есть доступ только к php.ini Доступа к apache.conf - нет И ответьте, пожалуйста, на мой вопрос: И решил переделать загрузку сабмитом формы без аджакса - и вопрос, а есть ли удобные утилиты для загрузки больший файлов наподобе FormData, но при сабмите формы? |
| Автор: ksnk 29.3.2016, 13:46 |
| mstdmstd, Да, `jquery file upload` в строке гугла. Например https://plugins.jquery.com/blueimp-file-upload/ |
| Автор: mstdmstd 29.3.2016, 22:45 |
| C Query File Upload - я работал - но не въеду как это поможет с загрузкой больших файлов ? Разве на этот загрузчик не действуют те же ограничения в максимальном размере post-запроса? |
| Автор: ksnk 29.3.2016, 22:59 |
| Если нет намерений разбираться с настройками сервера, то остается только уменьшить загружаемый образ. FormData позволит не увеличивать размер POST лишними перекодировками. Если нет желания разбираться с FormData, то готовый плагин сделает все сам. |
| Автор: whatisnot 30.3.2016, 17:18 | ||
Для современных браузеров это можно сделать используя FileReader. FormData, это не тот объект, который поможет в данном случае. Отправлять в base64, это в три раза больший объем от исходного. |
| Автор: ksnk 30.3.2016, 17:24 |
| whatisnot, Каким образом FileReader поможет загрузить файл на сервер? |
| Автор: whatisnot 31.3.2016, 02:17 |
Для этого достаточно прочесть о методах данного объекта. Все просто - большие файлы разбиваются на части и передаются на сервер частями. |
| Автор: mstdmstd 31.3.2016, 16:18 | ||
| Отправлять в base64, это в три раза больший объем от исходного Значит мне декадировку надо делать на клиенте и отправлять в сабмит уже перекодированную строку Для этого можно использовать функцию decode64 отсюда http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html Судя по описанию это кроссбаузерное решение... Это уменьшает файл отправки - но не факт что будет достаточно Смотрим FileReader( https://developer.mozilla.org/en/docs/Web/API/FileReader ):
А вот методов для записи я не вижу. Если whatisnot, ничего не напутал, то, плиз, ткните, что за методы? |
| Автор: ksnk 31.3.2016, 18:40 |
| Откуда взялась такая строка? Может чуть ранее по коду есть более удобный вид? Можно строку преобразовать в объект blob, который http://stackoverflow.com/questions/4998908/convert-data-uri-to-file-then-append-to-formdata. Пример, правда, с formData, но и FileReader должен такое открывать. |
| Автор: whatisnot 31.3.2016, 19:05 | ||
Методов для этого придется использовать много и не только FileReader. Ну напрягите гугл, об этом (загрузка файлов на сервер частями) написано так много, вот с лету первое попавшееся -http://www.codenet.ru/webmast/js/html5-ajax-partial-upload/, что переписывать уже описанное... Есть на Хабре статьи по этому поводу, и решений не одно. Вы родите что либо свое из познанного, а уже о своих ошибках, если будут допущены, спрашивайте. |
| Автор: mstdmstd 1.4.2016, 09:08 | ||||||
| Спасибо, буду пробовать Пока что я хочу 64-битной строку декодировать на клиенте и отправить сабмитом формы Возможно уменьшив данные в сабмит и не будет ошибки из-за большого обьема данных... Делаю
Форма сабмититься и файл записывается на диск функцией file_put_contents без перекодировки и изменений но при попытке прочитать его получаю
И открыв этот файл в текстовом редакторе я вижу http://i.imgur.com/luLBkhj.png Сравнивая этот файл с другими png-файлами в текстовом редакторе вижу что они не похожи Функция decode64 взята отсюда http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html Я пробовал использовать atob вместо decode64 и тот же результат Изначально я отправлял 64-данные и на сервере делал перекодировку перед записью в файл:
|
| Автор: ksnk 1.4.2016, 11:05 |
| mstdmstd, Я понимаю, конечно, желание обойтись малой кровью, но FormData был придуман совсем не от того, что кому то не хотелось использовать стандартную форму. Причина в том, что стандартной формой можно сделать далеко не все. В частности, послать файл довольно сложно. А в "обычном" для формы виде - практически невозможно. Можно посмотреть на мои ссылки и попытаться воспользоваться этим объектом. Потом, когда размер загружаемого файла опять упрётся в нежелание разбираться с настройками сервера, можно почитать про FileReader, поискать примеры его использования для загрузки файлов по кусочкам. Если нужен результат, а не личный опыт - проще и разумнее воспользоваться плагином. |
| Автор: mstdmstd 5.4.2016, 13:36 |
| Спасибо за подсказки! Сделал с небольшими изменениями как описано здесь https://habrahabr.ru/company/Techart/blog/100189/. Как я понимаю, решение кроссбраузерно, пока у браузера клиента хватит памяти... Локально и на сервре работает, хотя судя по кометариям во многих случаях этого недостаточно... |
| Автор: ksnk 5.4.2016, 14:09 | ||
Нужно понимать, что пока клиент не загрузит все данные, его броузер(страница) будет заблокирован. Можно посмотреть на комментарии по ссылке на хабре
Ну и тот факт, что статья написана 6 лет назад говорит о том, что плагины могли бы оказаться уже написаными. https://habrahabr.ru/post/154097/ - более новая статья, с примерами работы с FileReader и FormData |