【问题标题】:SHA256 an uploaded file in Yesod - Using Conduit and Data.Digest.Pure.SHASHA256 Yesod 中上传的文件 - 使用 Conduit 和 Data.Digest.Pure.SHA
【发布时间】:2015-07-19 09:34:07
【问题描述】:

我正在使用 yesod 处理文件上传,并希望将上传的文件保存到我的服务器上的文件中,该文件的名称为内容的 SHA256。

我认为处理程序级函数看起来像:

fileMove fInfo (basePath <> generateSha fInfo)

这个问题的中心是如何写generateSha :: FileInfo -&gt; 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. completeSha256Incremental 的 Int 参数是什么。

有人可以指出正确的方向吗?

【问题讨论】:

标签: haskell yesod sha conduit


【解决方案1】:

这只是部分答案。我现在陷入了阴谋集团的地狱,无法安装 sha-streams 以查看是否正常。

按如下方式逐步计算 SHA256:

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

pushChunk 来自Data.Binary.Get。这向您展示了所有函数调用如何组合在一起,但对于流式场景来说不是很实用。

要将其与管道一起使用,您需要将其转换为 Sink

【讨论】:

  • 由于completeSha256Incremental 缺少Int 参数,因此无法编译。你知道Int 是干什么用的吗?
  • 我看了下源码,参数的名字是pad。它用于对输入数据的末尾进行零填充。我会假设使用 0 不会填充任何内容,这可能是您想要的。
猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 2013-10-09
  • 1970-01-01
相关资源
最近更新 更多