Получение максимального размера данных-Uri в Javascript

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

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

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

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

Ответ 1

Я решил жестко указать эту таблицу:

Здесь script я использую для проверки 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 МБ

Ответ 2

Как насчет старого старого hardcode?: -)

Я также могу представить некоторый js-тест, следовательно, он не является надежным и требует связи с сервером хотя бы один раз и, вероятно, не очень надежный, поскольку он также может варьироваться в зависимости от браузера, а также о возможности сервера обрабатывать длинные URL-адреса (но по крайней мере, вы знаете это для своего сервера). В любом случае, это: загрузить статическую страницу html с вашего сервера (с заголовками http, чтобы кэшировать его навсегда на клиенте, не изменяя параметры запроса) в скрытый iframe или просто с помощью ajax get. Например, вы знаете, что целевой URL ( "data: application..." ) составляет 3000 символов. Затем вы создаете фальшивый URL-адрес той же длины, что и ваш статический html http://yourserver.com/test.html?param1=param1&param2=param2&.. и попробуйте загрузить его. Если нагрузка преуспевает, чем штраф, чтобы открыть реальный URL.

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