gpt4 book ai didi

haskell - 使用 Yesod 高效上传大文件

转载 作者:行者123 更新时间:2023-12-04 01:02:48 25 4
gpt4 key购买 nike

我想用我的 Yesod 应用程序实现大文件上传。现在我有:

module Handler.File where

import Import

import System.Random
import System.FilePath
import Control.Monad
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Text.Encoding

-- upload

uploadDirectory :: FilePath -- FIXME: make this configurable
uploadDirectory = "incoming"

randomFileName :: IO FilePath
randomFileName = do
fname'base <- replicateM 20 (randomRIO ('a','z'))
let fname = uploadDirectory </> fname'base <.> "bin"
return fname

fileUploadForm :: Form (FileInfo, Textarea)
fileUploadForm = renderDivs $ (,)
<$> fileAFormReq "Choose a file"
<*> areq textareaField "What's on the file?" Nothing

getFileNewR :: Handler RepHtml
getFileNewR = do
(formWidget, formEnctype) <- generateFormPost fileUploadForm
defaultLayout $ do
setTitle "Upload new file."
$(widgetFile "file-new")

postFileNewR :: Handler RepHtml
postFileNewR = do
user <- requireAuth
((result, formWidget), formEnctype) <- runFormPost fileUploadForm
case result of
FormSuccess (fi,info) -> do
fn <- liftIO randomFileName
liftIO (LBS.writeFile fn (fileContent fi))
let newFile = File (entityKey user) fn info (fileName fi) (fileContentType fi)
fid <- runDB $ insert newFile
redirect (FileViewR fid)
_ -> return ()

defaultLayout $ do
setTitle "Upload new file."
$(widgetFile "file-new")

大部分都很好,除了几个问题:
  • 文件的最大大小约为 2 兆字节。我有一个修复,但这是正确的方法吗?我的修复是在我的应用程序的 Yesod 实例中覆盖 maximumContentLength 方法的默认实现,如下所示:

    maximumContentLength _ (Just (FileNewR _)) = 2 * 1024 * 1024 * 1024 -- 2 GB
    最大内容长度 _ _ = 2 * 1024 * 1024 -- 2 兆字节
  • 使用的内存量等于文件的大小。这确实是次优的。我想使用 http://hackage.haskell.org/packages/archive/wai-extra/1.2.0.4/doc/html/Network-Wai-Parse.html 中的 tempFileBackEnd但我不知道如何将其实际连接到我的请求中并使其与表单逻辑(隐藏的 _token 字段等)一起使用。
  • 上传是“单次拍摄”:如何使其与基于 Flash/Html5 的上传器一起向用户显示进度的任何示例?
  • 最佳答案

  • 你的解决方案是正确的。 maximumContentLength 设置的目的是允许您为需要更大上传的特定路由覆盖此值。
  • 这是 yesod-core 中当前文件处理设置的一个缺点。它目前被硬编码为使用内存文件上传。我们过去在邮件列表中讨论过这是次优的。我刚刚创建了一个 Github issue为此,该修复程序将包含在 Yesod 1.1 中(尽管没有发布时间表)。
  • 我没有这方面的例子,对不起。
  • 关于haskell - 使用 Yesod 高效上传大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10880105/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com