Размер загруженного файла

Упрощенная громоздкая

Несмежная версия

Sub Bulky()

    ' Sheet Name, Cells List, Date Cell, Weeks List, Days in Week
    Const cSheet As String = "Monthly Status"
    Const cCells As String = "K34,K33,K32,K31,K30,K29,K28,K27,K26,K25,K24"
    Const cDateCell As String = "K36"
    Const cWeeks As String = "6,8,9,11,12,19,20,22,23,26,26"
    Const cDays As Long = 7

    Dim vntC As Variant   ' Cells Array
    Dim vntW As Variant   ' Weeks Array
    Dim RefDate1 As Date  ' Date
    Dim i As Long         ' Arrays Row Counter

    With Sheets(cSheet)
        RefDate1 = .Range(cDateCell).Value
        If RefDate1 = False Then
            .Range(cCells).ClearContents
          Else
            vntC = Split(cCells, ",")
            vntW = Split(cWeeks, ",")
            For i = 0 To UBound(vntC)
                .Range(vntC(i)).Value = RefDate1 - (cDays * CLng(Trim(vntW(i))))
            Next
        End If
    End With

End Sub

Смежная (K24: K34) Быстрая версия

Sub Bulky2()

    ' Sheet Name, Source Range, Date Cell, Weeks List, Days in Week
    Const cSheet As String = "Monthly Status"
    Const cCells As String = "K24:K34"
    Const cDateCell As String = "K36"
    Const cWeeks As String = "26,26,23,22,20,19,12,11,9,8,6"
    Const cDays As Long = 7

    Dim vntT As Variant   ' Target Array
    Dim vntW As Variant   ' Weeks Array
    Dim RefDate1 As Date  ' Date
    Dim i As Long         ' Arrays Row Counter

    With Sheets(cSheet)
        RefDate1 = .Range(cDateCell).Value
        If RefDate1 = False Then
            .Range(cCells).ClearContents
          Else
            vntW = Split(cWeeks, ",")
            ReDim vntT(1 To UBound(vntW) + 1, 1 To 1)
            For i = 1 To UBound(vntT)
                vntT(i, 1) = RefDate1 - (cDays * CLng(Trim(vntW(i - 1))))
            Next
            .Range(cCells) = vntT
        End If
    End With

End Sub
13
задан wprl 8 April 2013 в 23:04
поделиться

3 ответа

http://www.faqs.org/rfcs/rfc1867.html

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

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

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

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

13
ответ дан 2 December 2019 в 00:04
поделиться
  1. Я не уверен, но Вы не должны действительно полагать, что что-либо отправило в заголовке, поскольку он мог фальсифицироваться пользователем.

  2. Это зависит от того, как сервер работает. Например, в PHP Ваш сценарий не будет работать, пока загрузка файла не завершена, таким образом, это не было бы возможно.

1
ответ дан 2 December 2019 в 00:04
поделиться

РЕДАКТИРОВАНИЕ: перед тем, чтобы заходить слишком далеко можно хотеть проверить этот другой ответ, полагающийся на апачскую конфигурацию: Используя jQuery, Ограничивая Размер файла Перед Загрузкой. описание ниже только полезно при реальной необходимости еще в большем количестве пользовательской обратной связи.

Да, можно получить некоторую информацию заранее, прежде, чем позволить загрузку целого файла.

Вот пример заголовка, прибывающего из формы с enctype="multipart/form-data" атрибут:

POST / HTTP/1.1
Host: 127.0.0.1:8000
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.7,fr-be;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------886261531333586100294758961
Content-Length: 135361

-----------------------------886261531333586100294758961
Content-Disposition: form-data; name=""; filename="IMG_1132.jpg"
Content-Type: image/jpeg

(data starts here and ends with -----------------------------886261531333586100294758961 )

У Вас есть Довольная Длина в заголовке, и дополнительно существует Тип контента в заголовке части файла (каждый файл имеет свой собственный заголовок, который является целью многослойного кодирования). Остерегайтесь этого, это - обязанность за браузер установить соответствующий Тип контента путем предположения типа файла; Вы не можете гарантировать это, но это должно быть довольно надежно для раннего отклонения (все же, необходимо проверить целый файл, когда это совершенно доступно).

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

Если Вы не хотите обеспеченное содержание и останавливаете загрузку, у Вас нет выбора, кроме как жестоко закрыть сокет. Пользователь будет только видеть запутывающее "соединение, сброшенное одноранговым узлом" сообщение. И это сосет, но это дизайном.

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

  • Я использую jQuery, чтобы сказать мне, если поле файла изменилось
  • Когда новый файл будет выбран, отключите все другие поля файла на той же форме для получения только что один.
  • Отправьте файл асинхронно (jQuery может сделать это для Вас, он использует скрытый кадр),
  • Серверная сторона, проверьте заголовок (довольная длина, тип контента...), сократите соединение, как только Вы получили то, в чем Вы нуждаетесь.
  • Установите переменную сеанса, говорящую если, что файл был в порядке или нет.
  • Клиентский, поскольку файл загружается на кадр, Вы даже не получаете вида обратной связи, если соединение закрывается. Ваша единственная альтернатива является таймером.
  • Клиентский, таймер опрашивает сервер для получения состояния для загруженного файла. Сторона сервера, Вам установили ту переменную сеанса, передаете ее обратно brower.
  • У клиента есть код состояния; представьте его к своей форме: сообщение об ошибке, зеленая галочка / красный X, безотносительно. Сбросьте поле файла или отключите форму, Вы решаете. Не забывайте повторно включать другие поля файла.

Довольно грязный, а? Если у какого-либо из Вас есть лучшая альтернатива, я внимательно слушаю.

2
ответ дан 2 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

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