2015-07-18 7 views
0

Я обрабатываю загрузку файла с помощью Yesod и хотел бы сохранить загруженный файл в файл на моем сервере с именем SHA256 содержимое.SHA256 загруженный файл в Yesod - с использованием Conduit и Data.Digest.Pure.SHA

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

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 полной версииSha256Incremental.

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

+0

Это другая реализация, но я бы рекомендовал проверить [cryptohash-conduit] (http://haddock.stackage.org/nightly-2015-07-18/cryptohash-conduit-0.1.1/Crypto-Hash -Conduit.html), который построен поверх пакета [cryptohash] (https://www.stackage.org/package/cryptohash) (и написан тем же автором). –

ответ

1

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

Расчет SHA256 постепенно делается так:

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

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

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

+0

Это не компилируется из-за отсутствия аргумента 'Int' для' completeSha256Incremental'. Знаете ли вы, для чего предназначен 'Int'? –

+0

Я посмотрел на источник, а имя параметра - «pad». Он используется для нулевого заполнения конца входных данных. Я бы предположил, что использование 0 для него не делает ничего, что возможно, что вы хотите. – NovaDenizen

 Смежные вопросы

  • Нет связанных вопросов^_^