Нет ничего хитрого в том, чтобы отправить форму на сервер аяксом.
Нет ничего хитрого в том, чтобы нарисовать картинку в HTML5 Canvas.
Но я пытаюсь отправить картинку из Canvas и чот впадаю в ступор :)
Со стороны канваса все ок, картинка готова, запихана в data:image/png;base64,....... и передается аяксом на сервер в $_POST['картинко'].
Сервер же ожидает картинку в $_FILES — и в общем это хорошо, нельзя отказываться от этого полезного механизма.
Но в $_FILES пусто... аякс про него ничего не знает, а с формой работать не получится: на сервер отправляется не загруженный юзером файл, а результат из Canvas. И вот тут засада.
Все что нашел по этому поводу — полторы статьи за 200* год и везде ошибка 404...
Чо делать, камраде?
Глюкъ Виртуален: у вас 1000 юзеров в один момент загружают 1000 файлов по 1мб? Я думаю врядли. Что там за картинки у вас, что они по 1мб весят? Вы что-то делаете не так.
Глюкъ Виртуален: для своего аватара я уже выбрал картинку, и она весила намного меньше 1мб.
Я незнаю зачем вам на канвасе рисовать картинки размером >1мб, вам виднее.
Решение по ссылке выше можно оптимизировать. Я не знаю зачем там 2 раза str_replace, видать у человек были пробелы в строке. Там можно обойтись 1 str_replace + base64_decode.
Не хотите str_replace? Используйте preg_replace.
Не хотите preg_replace? Используйте explode.
Решений куча, вы просто не хотите додумать их сами.
D' Normalization: поздравляю, вы вошли в 2% людей, умеющих пользоваться Фотошопом :)
Так вот, остальные 98% этого не умеют, и у 100% из них на смартфоне не установлен фоторедактор.
Когда они хотят сменить аватар, они просто делают фото камерой смартфона и затем загружают это фото в кабинет.
По секрету — эти фото могут весить намного больше 1М...
Все решения по загрузке файла требуют обработку входной строки пхпой. Я сейчас обхожусь одним str_replace, но считаю это извращением и спрашиваю совета. Но вместо советов я к сожалению вижу здесь типичный русский форум. Что печально.
Глюкъ Виртуален: а я вижу "типичного русского незнайку", который сам создаете себе проблему, и потом героически пытается ее решить. Я уже говорил что вы что-то делаете не так? Так вот, вы что-то делаете не так.
Я не знаю зачем вы загружаете авартарки размером в 10мб через канвас, и затем неделю пытаетесь обойти "обработку входной строки пхпой".
Для меня загадка, почему вы не можете загрузить фотографию обычным способом, пережать её, и отдать юзеру для редактирования пережатую версию.
D' Normalization: а зачем вам знать слишком много? Вы прочитали вопрос и если у вас есть на него ответ — велкоммен. Если просто любопытно — я удовлетворю ваше любопытство, только не стройте из себя большого босса, а просто спросите.
Отвечаю.
За мкадом существует внушительная территория, где 3G/LTE еще нет и в ближайшую пятилетку не появится. Там пользуются обычным E/GPRS по 9 рублей за мегабайт (с тарификацией в обе стороны, Карл!) и со скоростью от "очень плохо" до "вообще тормозит" и поэтому гонять мегабайты ради аватарки слегка глупо.
Для этого я сделал механизм позиционирования/обрезки/сжатия на клиенте, который использует для всего этого обычный HTML5 Canvas. Юзер загрузит свою 5-мегабайтную фотку в этот канвас локально, понажимает на кнопки, и передаст на сервер уже готовый — обрезанный и ужатый — аватар весом от силы килобайт 50.
И так как форма при отправки аватара не сабмитится (ее вообще здесь нет), то данные на сервер отправляются $.post. И вот тут хотелось бы избавить сервер от лишней работы.
Я буду рад, если вы открыли для себя еще один кейс с канвасом.
Глюкъ Виртуален: так замечательно. Чем вас не устраивают 50кб?
Я дал вам решение, но оно вас не устраивает. Вам не нравится str_replace? Используйте substr - будет немного иначе.
Если вам так не хочется нагружать сервер всякими str_replace, то обрезайте строку на клиенте. Вам всё равно эти данные не нужны. Просто принимайте чистую base64 строку, и кастуйте base64_decode на нее.
Не хотите base64_decode? Вызывайте консольный скрип, по типу: system("base64 -d {$data} > image.png");