получение максимального размера Data-Uri в Javascript


Я хочу экспортировать данные в виде URI данных, только если размер данных не превышает максимальный размер URI данных, поддерживаемый текущим браузером , больше, чем файл, который я хочу загрузить.

document.location.href= "data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,"+data

Это иногда приводит к ошибке браузера, когда файл слишком большой, но я хотел бы, чтобы ошибка могла быть поймана до загрузки (чтобы попробовать другой метод, например).

Как я могу получить максимальный размер data-URI в JS ?

2 4

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

Результаты:

  1. Chrome (начиная с версии 28): работает с 2 097 152 байтами , что составляет ровно 2 МБ
  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&param2=param2&.. и попробуйте загрузить его. Если загрузка завершится успешно, то можно открыть реальный url.

В целом я думаю, что хардкод не так уж плох в этом случае.