У меня есть приложение rails на Heroku (cedar env). У него есть страница, где я делаю данные холста в изображении с помощью метода toDataURL()
. Я пытаюсь загрузить возвращенную строку данных изображения base64 непосредственно в s3 с помощью JavaScript (минуя серверную). Проблема в том, что, поскольку это не файл, как я могу загрузить данные, закодированные в base64, непосредственно на S3 и сохранить их в виде файла?
Как загрузить данные изображения с кодировкой base64 на S3 с использованием только JavaScript?
Ответ 1
Я нашел способ сделать это. После многого поиска, глядя на различные учебники.
Вам нужно преобразовать URI данных в blob, а затем загрузить этот файл на S3 с помощью CORS, если вы работаете с несколькими файлами, у меня есть отдельные запросы XHR для каждого.
Я нашел эту функцию, которая превращает ваш URI данных в blob, который затем можно загрузить на S3 напрямую, используя CORS (Преобразовать URI данных в Blob)
function dataURItoBlob(dataURI) {
var binary = atob(dataURI.split(',')[1]);
var array = [];
for(var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
return new Blob([new Uint8Array(array)], {type: 'image/jpeg'});
}
Ответ 2
Ответ Jamcoope очень хорош, однако конструктор blob не поддерживается всеми браузерами. В первую очередь Android 4.1 и Android 4.3. Существует Blob
polyfills, но xhr.send(...)
не будет работать с polyfill. Лучше всего сделать что-то вроде этого:
var u = dataURI.split(',')[1],
binary = atob(u),
array = [];
for (var i = 0; i < binary.length; i++) {
array.push(binary.charCodeAt(i));
}
var typedArray = Uint8Array(array);
// now typedArray.buffer can be passed to xhr.send
Ответ 3
Если кто-то заботится: вот приведенная выше версия функции вышеперечисленного!
convertToBlob = (base64) ->
binary = atob base64.split(',')[1]
array = []
for i in [0...binary.length]
array.push binary.charCodeAt i
new Blob [new Uint8Array array], {type: 'image/jpeg'}
Ответ 4
Не уверен, что OP уже решил это, но я работаю над очень похожими функциями. Проводя небольшое исследование, я столкнулся с этими статьями, которые могут быть полезны.