получение максимального размера Data-Uri в Javascript
Я хочу экспортировать данные в виде URI данных, только если размер данных не превышает максимальный размер URI данных, поддерживаемый текущим браузером , больше, чем файл, который я хочу загрузить.
document.location.href= "data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,"+data
Это иногда приводит к ошибке браузера, когда файл слишком большой, но я хотел бы, чтобы ошибка могла быть поймана до загрузки (чтобы попробовать другой метод, например).
Как я могу получить максимальный размер data-URI в JS ?
2 ответа:
Я решил жестко закодировать эту таблицу:
Вот сценарий, который я использую для тестирования maxsize:
String.prototype.repeat = function( num ) { return new Array( num + 1 ).join( this ); } testDataURI=function(size) { window.open("data:text/plain,"+"a".repeat(size-16)) } testDataURI(100000) //test 100k characters
JSFIDDLE
Результаты:
- Chrome (начиная с версии 28): работает с 2 097 152 байтами , что составляет ровно 2 МБ
- Firefox (начиная с версии 26): работает с 1 040 000 байт , что, вероятно, составляет 1 МБ
А как насчет старого доброго жесткого кода ? :- )
Я также могу представить себе некоторый тест js, поэтому он не надежен и требует связи с сервером по крайней мере один раз и, вероятно, не очень надежен, поскольку он также может варьироваться в зависимости от реализации браузера, а также от возможности сервера обрабатывать длинные URL-адреса (но, по крайней мере, вы знаете это для вашего сервера). В любом случае, вот он: загрузите статическую html-страницу с вашего сервера (с HTTP-заголовками, чтобы кэшировать ее навсегда на клиенте, не меняя по запросу параметры) в скрытый iframe или просто с ajax get. Например, вы знаете, что целевой url ("data: application...") имеет длину 3000 символов. Затем вы создаете поддельный url той же длины для вашего статического html http://yourserver.com/test.html?param1=param1¶m2=param2&.. и попробуйте загрузить его. Если загрузка завершится успешно, то можно открыть реальный url.
В целом я думаю, что хардкод не так уж плох в этом случае.