Как указать конец файла при отправке по сети - PullRequest
1 голос
/ 11 апреля 2011

Мой сервлет читает из двоичного файла с помощью FileInputStream.read ().Возвращает -1, если достигнут конец файла.Затем он отправляет байты файла клиенту через поток ответов.

Я хочу затем отправить байты хеша md5 файла через поток ответов.Как мне отделить конец файла от md5 файла, чтобы клиент знал, какие байты какие?Я не могу отправить -1 байт, потому что тогда поток перестает работать.

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

Ответы [ 3 ]

2 голосов
/ 11 апреля 2011

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

Если файл достаточно мал, вы можете записать его в ByteArrayOutputStream во время чтения / хэширования, чтобы избежатьчтобы прочитать его дважды - но если файл большой, вы, вероятно, не захотите принять этот удар памяти.

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

1 голос
/ 11 апреля 2011

Другие ответы хороши - я просто упомяну это, чтобы дать вам другую точку зрения.Вы можете сделать хеш MD5 отдельным ресурсом в вашем пространстве имен сервлета.

Например, ваш клиент запрашивает «путь / файл загрузки» для загрузки файла и «путь / файл загрузки.md5» для получения md5.Ваш код, который вычисляет MD5, может делать это во время загрузки файла и записывать в файловую систему или сохранять хэш в кэше (возможно, постоянном).

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

0 голосов
/ 11 апреля 2011

Сначала отправьте хеш MD5, поскольку он имеет известную длину.

...