Я пытался повторно внедрить загрузчик изображений HTML5, такой как на сайте Mozilla Hacks , но он работает с браузерами WebKit. Частью задачи является извлечение файла изображения из canvas
объекта и добавление его в объект FormData для загрузки.
Вопрос заключается в том , что в то время как canvas
имеет toDataURL
функцию , чтобы возвратить представление файла изображения, объект FormData принимает только файл или объекты Blob из API файлов .
Решение Mozilla использовало следующую функцию только для Firefox canvas
:
var file = canvas.mozGetAsFile("foo.png");
... который недоступен в браузерах WebKit. Лучшее решение, о котором я могу подумать, - это найти способ преобразовать URI данных в объект File, который, как мне показалось, может быть частью File API, но я никак не могу найти что-то для этого.
Является ли это возможным? Если нет, есть ли альтернативы?
Спасибо.
источник
Ответы:
Поработав с несколькими вещами, мне удалось выяснить это самому.
Прежде всего, это преобразует dataURI в Blob:
Отсюда легко добавить данные в форму, чтобы они были загружены в виде файла:
источник
POST
илиPUT
для S3?ArrayBuffer
, который затем записывается вBlobBuilder
экземпляр.var file = new File( [blob], 'canvasImage.jpg', { type: 'image/jpeg' } ); fd.append("canvasImage", file);
BlobBuilder и ArrayBuffer теперь устарели, вот код верхнего комментария, обновленный конструктором Blob:
источник
array=[]; array.length=binary.length;
...array[i]=bina
... и т. Д. Итак, массив предварительно выделен. Это спасает push () от необходимости расширять массив каждую итерацию, и мы обрабатываем, возможно, миллионы элементов (= байтов) здесь, так что это важно.Этот работает в iOS и Safari.
Вам нужно использовать решение ArrayBuffer от Stoive, но вы не можете использовать BlobBuilder, как указывает vava720, так что здесь представлено сочетание обоих.
источник
Firefox имеет методы canvas.toBlob () и canvas.mozGetAsFile () .
Но другие браузеры этого не делают.
Мы можем получить dataurl из canvas, а затем преобразовать dataurl в объект blob.
Вот моя
dataURLtoBlob()
функция. Это очень коротко.Используйте эту функцию с FormData для обработки вашего холста или dataurl.
Например:
Также вы можете создать
HTMLCanvasElement.prototype.toBlob
метод для браузера, не являющегося гекконовым движком.Теперь
canvas.toBlob()
работает для всех современных браузеров не только Firefox. Например:источник
Мой предпочтительный способ - canvas.toBlob ()
Но, в любом случае, здесь есть еще один способ конвертировать base64 в BLOB-объект, используя fetch ^^,
источник
XMLHttpRequest
URL-адрес данных был просто URL-адресом. Вы можете использовать ajax для извлечения этого ресурса, и у вас есть возможность решить, хотите ли вы использовать его как blob, arraybuffer или textblob:
иdata:
не везде поддерживается всеми извлекающих реализаций. Мы используем этот подход, так как знаем, что будем иметь дело только с мобильными браузерами (WebKit), но, например, Edge не поддерживает itt: developer.mozilla.org/en-US/docs/Web/API/…Благодаря @Stoive и @ vava720 я объединил оба этих способа таким образом, избегая использования устаревших BlobBuilder и ArrayBuffer.
источник
Развивающийся стандарт выглядит как canvas.toBlob (), а не canvas.getAsFile (), как мог догадаться Mozilla.
Я не вижу ни одного браузера, поддерживающего его :(
Спасибо за эту замечательную тему!
Кроме того, любой, кто пытается принять принятый ответ, должен быть осторожен с BlobBuilder, так как я считаю, что поддержка ограничена (и пространством имен):
Вы использовали полифилл другой библиотеки для BlobBuilder?
источник
canvas.toBlob()
- это кажется гораздо более подходящим, чемgetAsFile
.BlobBuilder
похоже, не рекомендуется в пользуBlob
может быть использован без try catch.
Спасибо check_ca. Отличная работа.
источник
Исходный ответ от Stoive легко исправить, изменив последнюю строку для размещения Blob:
источник
Вот ES6-версия ответа Стоива :
Использование:
источник
Спасибо! @steovi для этого решения.
Я добавил поддержку в версию ES6 и изменил с unescape на dataURI (unescape устарела).
источник
сделай это просто: D
источник
toDataURL дает вам строку, и вы можете поместить эту строку в скрытый ввод.
источник
<input type=hidden value="data:..." />
), я хочу загрузить данные файла (как и то<input type="file" />
, что делает, за исключением того, что вы не можете устанавливатьvalue
свойства для них).У меня была точно такая же проблема, как у Равиндера Паяла, и я нашел ответ. Попробуй это:
источник
window.open(canvas.toDataURL("image/jpeg"))