Как можно определить размер файла в JavaScript?

Лучшее решение не состоит в том, чтобы просто использовать анонимные классы.

public class Test
{
    class DummyInterfaceImplementor : IDummyInterface
    {
        public string A { get; set; }
        public string B { get; set; }
    }

    public void WillThisWork()
    {
        var source = new DummySource[0];
        var values = from value in source
                     select new DummyInterfaceImplementor()
                     {
                         A = value.A,
                         B = value.C + "_" + value.D
                     };

        DoSomethingWithDummyInterface(values.Cast<IDummyInterface>());

    }

    public void DoSomethingWithDummyInterface(IEnumerable<IDummyInterface> values)
    {
        foreach (var value in values)
        {
            Console.WriteLine("A = '{0}', B = '{1}'", value.A, value.B);
        }
    }
}

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

10
задан Dan Lew 14 July 2009 в 18:08
поделиться

8 ответов

Краткий ответ, вы не можете

Также проверьте jGuru Как вы можете проверить размер файла из JavaScript в форме с типом ввода файла?

Вы будете найти некоторые важные моменты

Ответ очень прост, вы не можете.

Причина: безопасность браузера не позволяет скриптам (Javascript / VBScript) или даже апплеты и элементы управления ActiveX для чтения файлы с локального жесткого диска. Вы можете читать файлы, только если ваш код подписан некоторым центром сертификации (CA). Теперь тип ввода «ФАЙЛ» также не имеет разрешения на чтение файлов. Мы не можем сделать ничего об этом, поскольку это то, что говорит HTML. Так как это не может читать файлы, он не может найти размер файла, с которым вводится тег связан. Поскольку он не может найти размер файла, нет функция, предоставляемая JavaScript / VBScript, для возврата размера файла. Но если вам нужно найти размер файла, скажем, чтобы ограничить размер файла, загруженного на ваш веб-сервер. Тогда вы можете сделать это подсчет содержимого файла на стороне сервера, когда пользователь отправляет это к серверу. Это то, что любят многие провайдеры бесплатной электронной почты. www.hotmail.com do.

3
ответ дан 3 December 2019 в 22:01
поделиться

Как вы знаете, IE поддерживает свойство fileSize изображения. В других браузерах нет такой удачи ... однако вы можете изменить этот сценарий:

http://natbat.net/2008/Aug/27/addSizes/

Он использует JSON для чтения HTTP-заголовков файлы и отображать их фактический размер. Это должно помочь вам предотвратить загрузку больших анимированных GIF-файлов.

Что касается получения размеров:

var img = new Image();
theImage.src = "someimage.jpg";
actualwidth = theImage.width;
actualheight = theImage.height;

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

5
ответ дан 3 December 2019 в 22:01
поделиться

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

1
ответ дан 3 December 2019 в 22:01
поделиться

Проверка на стороне сервера всегда лучше, но в вашем случае Я понимаю, почему вы захотите сделать эту клиентскую часть.

Кроме того, кажется, что другие могли неправильно истолковать вопрос и что изображения, которые Даниэль хочет протестировать, уже загружены, и в этом случае существует довольно простой метод этого (при условии, что изображения находятся в том же домене, что и сценарий)

var getFileSize = function(address, responseHandler) {
  var req = new XMLHttpRequest();  

  req.open('head', address, true);  
  req.onreadystatechange = responseHandler;
  req.send(null);  
}

var responseHandler = function(resp) {
  if ( this.readyState == 1 ) {
    this.abort();
  }
  console.log(this.getResponseHeader("Content-length"));
};

getFileSize("http://stackoverflow.com/content/img/so/logo.png", responseHandler);

Бум. Этот пример работает в FF3 и, вероятно, в 2. Поскольку для этого вы используете Greasemonkey, совместимость браузера не кажется проблемой.

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

в этом случае есть довольно простой способ сделать это (при условии, что изображения находятся в том же домене, что и сценарий).

var getFileSize = function(address, responseHandler) {
  var req = new XMLHttpRequest();  

  req.open('head', address, true);  
  req.onreadystatechange = responseHandler;
  req.send(null);  
}

var responseHandler = function(resp) {
  if ( this.readyState == 1 ) {
    this.abort();
  }
  console.log(this.getResponseHeader("Content-length"));
};

getFileSize("http://stackoverflow.com/content/img/so/logo.png", responseHandler);

Бум. Этот пример работает в FF3 и, вероятно, в 2. Поскольку для этого вы используете Greasemonkey, совместимость браузера не кажется проблемой.

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

в этом случае есть довольно простой способ сделать это (при условии, что изображения находятся в том же домене, что и сценарий).

var getFileSize = function(address, responseHandler) {
  var req = new XMLHttpRequest();  

  req.open('head', address, true);  
  req.onreadystatechange = responseHandler;
  req.send(null);  
}

var responseHandler = function(resp) {
  if ( this.readyState == 1 ) {
    this.abort();
  }
  console.log(this.getResponseHeader("Content-length"));
};

getFileSize("http://stackoverflow.com/content/img/so/logo.png", responseHandler);

Бум. Этот пример работает в FF3 и, вероятно, в 2. Поскольку для этого вы используете Greasemonkey, совместимость браузера не кажется проблемой.

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

2
ответ дан 3 December 2019 в 22:01
поделиться

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

<input type="hidden" name="MAX_FILE_SIZE" value="10000000">

(max_file_size в байтов).

Однако это "недокументированный / неподдерживаемый" элемент некоторых браузеров. Лучше всего проверить размер файла на сервере после его загрузки.

Вы также можете использовать апплет Flash или Java для обработки загрузки и проверки файла там. См. http://www.masrizal.com/product/custom%20tag/cf_flashmultiupload/docs%20&%20examples/example.cfm и http: //www.saschawenning.

0
ответ дан 3 December 2019 в 22:01
поделиться

Атрибут DOM img.fileSize вернет фактический размер файла , на который имеется ссылка. Доступ к объекту img можно получить с помощью JQuery или коллекции изображений DOM. Однако это расширение только для IE.

Другой подход состоит в том, чтобы опустить атрибуты высоты и ширины в теге , чтобы загружалось полное изображение, а затем используйте img.height и img.width для определения размера загруженного изображения. Этот код можно поместить на страницу редактора профиля пользователя в качестве промежуточного шага между тем, чтобы кто-то ввел свою подпись в формате HTML, а затем показал им предварительный просмотр их подписи. Неуклюже, должен признать, но возможно.

0
ответ дан 3 December 2019 в 22:01
поделиться

Если вас беспокоят огромные изображения, установите максимальный размер загрузки, как сказал Ричи С., но также измените размер загруженного изображения на сервере и используйте версию с измененным размером.

Facebook делает это для большинства загружаемых изображений, чтобы отображались изображения разумного размера. Даже преобразование их в формат png в некоторых (в большинстве?) Случаях, что сводит творческую группу с ума из-за "потери качества".

0
ответ дан 3 December 2019 в 22:01
поделиться

То, что вы должны сделать, это запрос AJAX HEAD URL-адреса изображения, который получает только заголовок файла, а не его содержимое, поэтому выполняется намного быстрее. Один из заголовков, который вы получите в ответ, - Content-Length, и он сообщит вам размер изображения в байтах.

Подробнее здесь .

0
ответ дан 3 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: