Выбор границ загрузки файла HTTP - PullRequest
2 голосов
/ 28 ноября 2010

Таким образом, в настоящее время я изучаю загрузку файлов HTTP (в контексте использования HttpWebRequest для загрузки некоторых файлов во внешний API) и, как правило, вижу несколько десятков тире, используемых в качестве границы.Похоже, что браузеры обычно добавляют случайно выбранные шестнадцатеричные числа к тире.

Это кажется ужасно неуклюжим, если не сказать больше (смею ли я сказать, что ошибка в протоколе?).Поскольку мой конкретный сценарий использования включает в себя данные, которые могут очень хорошо содержать границы, которые я использую (независимо от того, что я выбираю; данные являются своего рода дампом), я должен быть на 100% уверен, что файл, который я загружаю, ничего не нарушает.Случайный выбор числа просто неприемлем для меня, даже если вероятность фактического столкновения составляет 1 на миллиард.Попытка повторения с другой случайно выбранной границей, если целевой скрипт обнаруживает какую-то ошибку, не является тем, что мне нравится.

Это единственный способ избежать этого, чтобы просканировать весь файл (часто много мегабайт большого размера).) чтобы увидеть, если моя выбранная граница не существует?Мне нужно выполнить много разных запросов при загрузке, поэтому во избежание потери ввода-вывода я хочу избежать сканирования всего файла.

Или есть какой-то параметр размера, который я могу передать, чтобыграница становится немного больше, чем формальность?

Что я пропускаю?Изменение удаленного API - это не вариант, поэтому кодирование в Base64 или добавление какого-либо escape-символа невозможно.

Ответы [ 4 ]

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

Лично я не знаю способа быстрее, чем сканировать ваши данные для границы. Я полагаю, что для большинства приложений именно так они и делают (скачайте исходный код для Firefox и, возможно, посмотрите?).

  1. Создана случайная граница (в идеале маловероятно, чтобы она возникала в данных, например -------- saDad8g3 --------)
  2. Данные искали содержащуюся в нем границу
  3. Если граница найдена, вернитесь к 1.

Я предполагаю, что если граница найдена, код изменяет созданную случайную границу и снова сканирует.

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

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

  1. Создана случайная граница (опять же, в идеале, вряд ли в данных)
  2. Не проверяйте свои данные на наличие вхождений (и просто предполагайте, что вероятность столкновения ОЧЕНЬ низка) и выполняйте загрузку.
  3. Если вы получили ошибку сервера, вернитесь к шагу 1, который создаст новую границу, которая, мы надеемся, НЕ ТАКЖЕ в данных, попробуйте снова.

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

0 голосов
/ 13 февраля 2018

При использовании всех 70 символов для произвольной буквенно-цифровой границы и 1 ГБ данных ваш шанс столкновения составляет не 1 на миллиард, а больше, как 1 на 10¹¹⁷. У вас больше шансов потерять свой левый мизинец в следующую йокосекунду из-за удара метеорита. Если это не даст вам уверенности, я ничего не боюсь :). Пожалуйста, прочитайте мой ответ на практически идентичный вопрос здесь .

0 голосов
/ 14 июля 2015

Чтобы обеспечить уникальность, используйте UUID / GUID для строки границы, как используется в коде, показанном в: https://wqweto.wordpress.com/2011/07/12/vb6-using-wininet-to-post-binary-file/

Генератор GUID онлайн: https://guidgenerator.com/online-guid-generator.aspx

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

"Чего мне не хватает?"

Здравый смысл?: P

Вот способ - прочитайте файл для загрузки, затем измените случайный байт и вуаля, вы создали себе границу, которая не повторяется в файле для загрузки точно.Но на самом деле это бессмысленно.Например, установка границы в 10 Кбайт уменьшит вероятность столкновения до такой степени, что человеческий род будет гораздо более вероятным исчезнуть, пока не произойдет столкновение байтов.

...