Рекомендуемый способ проверки размера файла при загрузке - PullRequest
12 голосов
/ 17 ноября 2010

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

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

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

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

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

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

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

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

Обновление:

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

alt text

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

alt text

Ответы [ 10 ]

6 голосов
/ 17 ноября 2010

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

5 голосов
/ 17 ноября 2010

В 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>
2 голосов
/ 26 ноября 2010

Я на самом деле задал этот самый вопрос (более или менее) несколько дней назад, и общий ответ, похоже, таков: это невозможно.

Для справки: Убедитесь, что размер загружаемого файла меньше, чем maxRequestLength до загрузки?

1 голос
/ 01 марта 2011

У вас может быть следующий код для получения функции 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>

Надеюсь, что эта помощь.

1 голос
/ 30 декабря 2010

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

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

1 голос
/ 29 ноября 2010

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

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

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

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

1 голос
/ 28 ноября 2010

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

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

1 голос
/ 27 ноября 2010

Я начну с того, что мне не удалось сгенерировать рабочую копию, и большая часть этого - мое понимание от чтения вокруг и небольшого опыта.Тем не менее, возможно, вы могли бы исследовать это немного больше и / или исправить меня, если я ошибаюсь.Главное указывает на идею классической формы со скрытым вводом с именем MAX_FILE_SIZE ... В PHP / Apache сервер остановится, если загрузка больше, чем MAX_FILE_SIZE (см. Последний пост из здесь ),Что касается PHP, массив $ _FILES вернет код ошибки (который можно увидеть здесь ).Обратите внимание на UPLOAD_ERR_FORM_SIZE .Чтобы собрать все это воедино, вы можете сделать так, чтобы JavaScript загружал файл в IFrame и получал результат.Если сервер выдает сообщение об ошибке (что в этой теории будет довольно быстро), JavaScript может просто предупредить пользователя.В противном случае мы можем предположить, что файл успешно загружен.Теперь попытаться разобраться в коде Google практически невозможно;быстрое сканирование HTML, насколько мне известно, не помогло никому ... У них действительно есть скрытые поля ввода, но ни одно из них не содержит MAX_FILE_SIZE в качестве имени.Они намного короче, и у большинства, кажется, нет ценностей.Но я верю, что это возможно.Мысли кто-нибудь?Кто знает, возможно, встроен великолепный веб-сервер Google с возможностью мгновенного отключения загрузки.Спасибо за прослушивание!

1 голос
/ 17 ноября 2010

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

0 голосов
/ 29 ноября 2010

LOL Ofc вы можете сделать это, это просто немного сложная работа, если вы ищете «flashbar загрузки» вместо использования данных, которые вы извлекаете, чтобы создать загрузчик, вы можете использовать его, чтобы передать его, сравнить или сделать все, что выхотите, чтобы тот, который я нашел, казался довольно хорошим, это тот, который не использует флешку, но вы можете использовать его для достижения того же самого http://www.plupload.com настраиваемый ps, вы можете заставить его просто использовать флэш, если вам действительно нравится

...