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
Но я не уверен в нескольких вещах:
- Как подключить это в кабелепроводе. В идеале я бы хотел, чтобы файл был в потоковом режиме.
- Используйте интерфейс SHA, чтобы постепенно наращивать хэш. Я могу получить SHA256 пустой строки достаточно легко, но я не уверен, как добавить значения. Предположительно это что-то скрыто в типе декодера?
- Что за
Int
Аргумент completeSha256Incremental есть.
Может ли кто-нибудь указать мне правильное направление?
1 ответ
Это только частичный ответ. Я застрял в Кабале и не могу установить sha-streams
чтобы убедиться, что все работает правильно.
Инкрементный расчет SHA256 выполняется следующим образом:
sha256FromChunks :: [ByteString] -> Digest SHA256State
sha256FromChunks cs = completeSHA256Incremental $
foldl pushChunk sha256Incremental cs
pushChunk
из Data.Binary.Get
, Это показывает, как все вызовы функций сочетаются друг с другом, но не очень удобно для сценария потоковой передачи.
Чтобы использовать это с каналом, вам нужно будет превратить его в Sink
,