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 пустой строки достаточно легко, но я не уверен, как добавить значения. Предположительно это что-то скрыто в типе декодера?
  3. Что за Int Аргумент completeSha256Incremental есть.

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

1 ответ

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

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

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

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

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

Другие вопросы по тегам