Загрузка файла asp.net - отслеживает загруженный размер

Я пытаюсь разработать систему для чего-то вроде этого с ASP.net/C#.

Пользователи платят за загрузку некоторого содержания (файлы - mp3s/PDFs, документ и т.д.).I должен смочь отследить число байтов, загруженных пользователем. Если число байтов загрузило, соответствуют числу байтов на сервере, я должен установить флаг в DB (говорящий, что загрузка была успешна, и препятствуйте тому, чтобы они загрузили файл снова/выяснение их для оплаты за загрузку снова). Если бы загрузка была неполной, то они должны смочь загрузить файл снова, не платя за нее снова (так как флаг не будет установлен).

Там какой-либо путь состоит в том, чтобы отслеживать число байтов, успешно загруженных клиентом?

Также, когда я вижу размер файла в своей машине WinXP, я вижу два размера (размер, размер на диске). Какой я должен рассмотреть? И это будет отличаться от одной ОС до другого?

8
задан ram 24 December 2009 в 14:48
поделиться

5 ответов

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

Они предоставляют только исходный код. Тем не менее, он построен чисто из застежки -молнии в cygwin с помощью g++. Они также заявляют о поддержке Visual Studio, но я не пробовал.

-121--4906670-
 mysql> set @table_name := 'mytable';
 Query OK, 0 rows affected (0.02 sec)

 mysql> set @sql_text:=concat('create table ',@table_name,'(id int unsigned)');
 Query OK, 0 rows affected (0.00 sec)

из http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html

-121--5086429-

можно создать обработчик asp.net, обслуживающий файл (для asp.net mvc u можно выполнить действие результата вместо... это то, что я использую). Убедитесь, что он поддерживает возобновляемые загрузки.

из списка можно отслеживать обслуживаемые байты.

Ps. это влечет за собой накладные расходы на производительность и позволяет IIS обслуживать его

обновить 1: Я использовал что-то довольно похожее на это http://dotnetslackers.com/articles/aspnet/Range-Specific-Requests-in-ASP-NET.aspx ... и статья имеет довольно четкое объяснение того, что внутри. Вы, вероятно, можете использовать это как есть, см. пример в этой публикации.

1
ответ дан 5 December 2019 в 17:38
поделиться

Отражение (взято из учебного пособия Oracle java )

Отражение обычно используется программами, которые требуют возможности проверки или изменения поведения во время выполнения приложений, работающих на виртуальной машине Java. Это относительно продвинутая функция и должна использоваться только разработчиками, обладающими сильным пониманием основ языка. С учетом этого предостережения отражение является мощным методом и может позволить приложениям выполнять операции, которые в противном случае были бы невозможны.

Самоанализ (взято из архива sun java beans tutorial )

Самоанализ - это автоматический процесс анализа узоров дизайна компонента для выявления свойств, событий и методов компонента. Этот процесс управляет публикацией и обнаружением операций и свойств компонента.

Интроспекция использует отражение, связь между интроспекцией и отражением может рассматриваться как сходная с JavaBeans и другими классами Java.

Возможно, стоит взглянуть на «Отражение и самоанализ: Объекты экспонируются» , где подробно рассматривается производительность и использование. Обратите внимание, что статья устарела, 1998 год.

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

-121--1031974-

Корректировка ответа Томаса Юнга выше: лучше сказать компаньон [List.type], потому что а) это должен быть стабильный способ ссылаться на него, не зависящий от схемы искажения имени и б) вы получаете нестираемые типы.

def singleton[T](implicit man: reflect.Manifest[T]) = {
  val name = man.erasure.getName()
  assert(name endsWith "$", "Not an object: " + name)
  val clazz = java.lang.Class.forName(name)

  clazz.getField("MODULE$").get(clazz).asInstanceOf[T]
}  

scala> singleton[List.type].make(3, "a")                       
res0: List[java.lang.String] = List(a, a, a)
-121--1474621-

Вы можете попробовать изучить коды ответа HTTP (т.е. 200, 404 и т.д.) - клиент и сервер будут обмениваться заголовками http, чтобы они знали, что происходит - вы должны иметь возможность отслеживать их, чтобы увидеть, были ли ответы успешными (не уверен - но вы должны быть в состоянии).

Что касается размера файла - я бы попробовал провести эксперименты с файлами «известных» размеров, сравнить то, что Http Logs говорит вам с тем, что говорит вам проводник.

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

1
ответ дан 5 December 2019 в 17:38
поделиться

Размер, который вы хотите, это размер (не размер на диске). Размер на диске включает в себя дополнительное пространство, которое проводится путем установки в размером блока 4K раздела. Размер - точное количество битов в файле.

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

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

Я думаю, что использую что-то вроде Windows Windows (2 часа после покупки), а затем заблокируйте его до IP после того, как первый запрос будет выполнять тот же результат, и приведет к тому, что в результате будет меньше проблем пользователей и поддержки вызовов. Кроме того, если файл не имеет своего рода строгий DRM, позволяя пользователю PersiSten Access на основе их вход в его вход, скорее всего, является соответствующей бизнес-моделью, потому что, как только они получат файл, который они могут скопировать его столько раз, сколько им нравится.

Посмотрите на DVD или Blu-ray, ни один объем защиты от копирования или контроля доступа не сохранит ваши файлы с пиратов, поэтому сделайте все удобные для законных пользователей.

0
ответ дан 5 December 2019 в 17:38
поделиться

Этот регекс идеально подходит для меня.

^([ \u00c0-\u01ffa-zA-Z'\-])+$

Это хорошо работает в php-средах с использованием preg_match (), но не везде.

Он соответствует Jérémie O'Co-nor , поэтому я думаю, что он соответствует всем UTF-8 именам.

-121--1543627-

Если вы не можете поместить дракона в A, вам потребуется создать другую таблицу и другую таблицу ссылок. Проблема заключается в создании уникального набора данных, которые необходимо сохранить (другая таблица), который не может быть таким же набором, как A. Так как это не тот же набор, вы больше не можете использовать таблицу связей (AtoB), который имеет внешние ключи, гарантирующие, что ссылка является ссылкой из набора A. Таким образом, можно создать следующие таблицы:

imaginary _ creatures

  • id
  • name

imaginary _ creatures _ to _ b

  • imaginary _ creatures _ id (ссылка на таблицу imaginary_creatures)
  • b _ id (ссылка на таблицу зоопарков)

Позже, когда вы хотите получить всех существ в зоопарке, вы можете сделать UNION

SELECT A.Name FROM A where A.ID IN 
   (SELECT AB.A_ID FROM AtoB AB WHERE B_ID = 
      (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))
UNION
SELECT i.name FROM imaginary_creatures i i.id IN 
   (SELECT ic.imaginary_creatures_id FROM imaginary_creatures_to_c ic 
    WHERE ic.b_id = (SELECT B.ID FROM B WHERE B.Name = 'Zoo Name'))

Возможно, есть лучший способ написать это, но это

-121--4180476-

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

while (context.Response.IsClientConnected) {

    bytesRead = ReadFileChunkAsByteArrayWIthOffsetOrWhatever(buffer, offset);

    context.Response.OutputStream.Write(buffer, 0, bytesRead);
    context.Response.Flush();

    offset += bytesRead;

    if (bytesRead != bufferSize)
        break;
}

Это сложно сделать 100% надежной из ASP, но это может быть сделано. Вы в значительной степени должны учитывать каждую возможную точку отказа и реагировать соответствующим образом.

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

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

7
ответ дан 5 December 2019 в 17:38
поделиться

Для подобного обслуживания пользовательских байтов вам потребуется реализовать собственный обработчик http.

Этот обработчик должен делать следующее:

  • Реализовать какую-то аутентификацию в обработчике http, чтобы вы знали, с кем имеете дело.
  • Затем вам нужно будет реализовать какое-то ведение журнала для запрашиваемых файлов и файлов, разрешенных для загрузки.
  • Реализуйте etags и заголовки expires для кэширования на стороне клиента.
  • Кэширование на стороне сервера
  • Deflate, сжатие gzip
  • Если вы хотите поддерживать возобновляемые загрузки, вам необходимо реализовать 206 частичных ответов. Это важно для потоковой передачи и обслуживания PDF-файлов любого типа.

Таким образом, вы должны обрабатывать следующие заголовки http:

  • ETag
  • Expires

  • Accept-Ranges

  • Range
  • If-Range

  • Last-Modified

  • If-Match
  • If-None-Match
  • If-Modified-Since
  • If-Unmodified-Since
  • Unless-Modified-Since

Если вы ищете примеры реализации обработчиков http, посмотрите: {{ 1}} http://code.google.com/p/talifun-web/wiki

Он имеет статический обработчик файлов, который реализует все указанные выше заголовки http, кэширование на стороне клиента и на стороне сервера и даже сжатие.

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

1
ответ дан 5 December 2019 в 17:38
поделиться
Другие вопросы по тегам:

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