Подтвердить что ты не робот

Рекомендуемый способ проверки размера файла при загрузке

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

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

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

Сегодня я столкнулся с функциями загрузки файлов в gmail. И протестировали это в браузере (IE) без установки флеш-памяти. То, что я нашел, было интересно. Если вы загрузили большой файл, они сделали обратную передачу и сразу же вернули сообщение, размер файла слишком велик.

Как это возможно, как они могут найти размер файла без загрузки всего содержимого.? Я считаю, что это нужно сделать, прочитав информацию заголовка HTTP. Я прав?

Итак, это точная функциональность, которую я хотел реализовать. Если флешка уже установлена, я могу использовать функцию uploadify для проверки размера, иначе может быть реализована технология never-hearof-technique-used-by-google.

может кто-нибудь порекомендовать мне, как это сделать?

Кто-нибудь раньше сталкивался с подобными проблемами, что вы сделали?

Update:

Загрузка Gmail со вспышкой, установленной в FF

alt text

без вспышки в IE

alt text

4b9b3361

Ответ 1

После многого поиска я могу использовать maxAllowedContentLength, чтобы ограничить размер загрузки в приложениях ASP.Net. Помните, что эти настройки работают только на IIS 7 или выше.

Так как это обрабатывается на уровне IIS, нам не нужно обрабатывать что-либо в коде сервера. Если предел размера превышает, он вернет код ошибки 404.13. Таким образом, вы можете легко проверить код на стороне клиента, чтобы определить проблему.

Это то, что я сделал для обработки больших файлов, если флешка не установлена ​​на клиентской машине.

Надеюсь, это поможет кому-то.

Для получения дополнительной информации о этих настройках прочитайте this

Ответ 2

Вы можете взглянуть на File API, который является черновиком для HTML 5. Здесь хорошая статья. То, что Gmail использует, если браузер поддерживает его, конечно. Но нет способа гарантировать, что это будет работать во всех браузерах.

Ответ 3

В IE вы можете сделать это с помощью JS и ActiveX:

function A()
{
  var oas = new ActiveXObject("Scripting.FileSystemObject");
  var d = document.a.b.value;
  var e = oas.getFile(d);
  var f = e.size;
  alert(f + " bytes");
}

</script>
</head>
<body>
<form name="a">
<input type="file" name="b">
<input type="button" name="c" value="SIZE" onClick="A();">
</form>
</body>
</html>

Ответ 5

Я не тестировал это, но нет ли заголовка "Content-Length" в запросе? Он будет содержать больше, чем просто загружаемый файл, но вы можете использовать его в качестве эталона, чтобы определить, слишком ли большой POST для обработки.

Ответ 6

  Я начну, сказав, что я не смог создать рабочую копию, и большинство из этого - это мое понимание из чтения и небольшого опыта. Тем не менее, возможно, вы могли бы изучить его немного больше и/или установить меня прямо, если я ошибаюсь.  Главное - идея классической формы со скрытым вводом с именем MAX_FILE_SIZE... В PHP/Apache сервер остановится, если загрузка больше MAX_FILE_SIZE (см. Последний пост из здесь). В PHP-части вещей массив $_FILES вернет код ошибки (который можно увидеть здесь). Обратите внимание на UPLOAD_ERR_FORM_SIZE.

    Чтобы собрать все это вместе, вы можете загрузить JavaScript в IFrame и получить результат. Если сервер выдает сообщение об ошибке (которое в этой теории будет довольно быстро), JavaScript может просто предупредить пользователя. В противном случае мы можем предположить, что файл теперь загружен успешно. Теперь попытка понять код Google почти невозможна; быстрое сканирование HTML доходит до меня, и это никому не помогло... У них действительно есть скрытые поля ввода, но ни один из них не имеет имя MAX_FILE_SIZE. Они намного короче, и большинство из них не имеют значений. Но я считаю, что это возможно. Мысли кто-нибудь?

  Кто знает, возможно, отличный веб-сервер Google встроен с возможностью мгновенного отключения загрузки. Спасибо, что слушаете!

Ответ 7

Я считаю, что загрузка файла основана на RFC 1867, хотя HTML5 заменяет все это. Вы можете полностью переопределить эту RFC-серверную сторону и проверить размер кумулятивного входящего потока.

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

Ответ 8

Он позволяет определить размер файла, который загружается даже до того, как загруженный файл был полностью перенесен. Даже при использовании Internet Explorer. Используя заголовок длины HTTP HTTP!
В мире java:
Прежде всего, если вы обрабатываете запрос, который поступает на сервер в первом сервлете/фильтре/контроллере до любой предыдущей массы потока с ним, вы также можете получить общий размер файла в заголовке длины содержимого (request.getContentLength()).

второй - посмотрите в реализации ajax, которые доказывают, что это возможно: http://www.ajaxfilebrowser.com/

Ответ 9

У вас может быть следующий код, чтобы получить функцию Gmail:

<html>
<head>
<script type="text/javascript">
$(function()
{

$('#btnSubmit').click(function()
{
if (typeof (input.files) != 'undefined') {  // this will work in firefox,chrome.
   if (input.files[0].fileSize > MAX_FILE_SIZE) {
        alert("file size exceeded");
         return false;
      }
 }
else
{
//this approach will work for ie 8.
$('iframe').bind('load'),function()
{
try
{
var text = $('iframe')[0].contentWindow.document.body ? $('iframe')[0].contentWindow.document.body.innerHTML : null;
}
catch(e)
{
alert('Server error occurred');
}
}
});
});

});
</script>
</head>
<body>
<form method="post" enctype="multipart/form-data" name="fileUpload" action="Default.aspx" target="responseFrame">
<input type="file"/>
<input type="submit" value="upload" id="btnSubmit"/>
</form>
<iframe src='' name='responseFrame' id='responseFrame' style='width:0px;height:0px;border:0;'></iframe>
</body>
</html>

Надеюсь на эту помощь.

Ответ 10

lol ofc вы можете это сделать, это всего лишь немного трудолюбия, если вы ищете "флеш-панель uploadbar", вместо того, чтобы использовать данные, которые вы извлекаете, чтобы создать загрузчик, вы можете использовать его для передачи или сравнения или делать то, что вы хотите тот, который я нашел, который казался довольно хорошим, - это тот, который не требует использования вспышки но вы можете использовать его для достижения того же http://www.plupload.com высоко настраиваемый постскриптум вы можете заставить его просто использовать flash, если вам действительно нравится