SHA256 загруженный файл в Yesod — использование Conduit и Data.Digest.Pure.SHA

Я обрабатываю загрузку файла с помощью yesod и хотел бы сохранить загруженный файл в файл на моем сервере с именем SHA256 содержимого.

Я думаю, что функция уровня обработчика будет выглядеть так:

fileMove fInfo (basePath <> generateSha fInfo)

Этот вопрос сосредоточен вокруг того, как написать generateSha :: FileInfo -> String.

Я вижу несколько функций, которые могут быть полезны:

fileSource :: MonadResource m => FileInfo -> Source m ByteString
sha256Incremental :: Decoder SHA256State
completeSha256Incremental :: Decoder SHA256State -> Int -> Digest SHA256State
showDigest :: Digest t-> String

Но я не уверен в нескольких вещах:

  1. Как подключить это в трубу. В идеале я хотел бы, чтобы он транслировал файл.
  2. Используйте интерфейс SHA для постепенного создания хэша. Я могу достаточно легко получить SHA256 пустой строки, но не знаю, как добавлять значения. Предположительно это что-то скрыто в типе Decoder?
  3. Что такое аргумент Int для completeSha256Incremental.

Может ли кто-нибудь указать мне в правильном направлении?


person cschneid    schedule 18.07.2015    source источник
comment
Это другая реализация, но я бы рекомендовал проверить cryptohash-conduit, созданный поверх cryptohash (написанный тем же автором).   -  person Michael Snoyman    schedule 19.07.2015


Ответы (1)


Это только частичный ответ. Я сейчас застрял в аду клики и не могу установить sha-streams, чтобы посмотреть, все ли работает правильно.

Инкрементальный расчет SHA256 выполняется следующим образом:

sha256FromChunks :: [ByteString] -> Digest SHA256State
sha256FromChunks cs = completeSHA256Incremental $
                          foldl pushChunk sha256Incremental cs

pushChunk из Data.Binary.Get. Это показывает, как все вызовы функций сочетаются друг с другом, но не очень практично для сценария потоковой передачи.

Чтобы использовать это с каналом, вам нужно превратить его в Sink.

person NovaDenizen    schedule 19.07.2015
comment
Это не компилируется из-за отсутствия аргумента Int для completeSha256Incremental. Вы знаете, для чего Int? - person Richard Cook; 21.04.2016
comment
Я посмотрел на источник, и имя параметра pad. Он используется для заполнения нулями конца входных данных. Я бы предположил, что использование 0 для него ничего не дополняет, что, вероятно, вам и нужно. - person NovaDenizen; 23.04.2016