如何使用Yesod将文件上传到服务器

Uri*_*olz 8 haskell file-upload yesod

我正在尝试编写一个允许用户将文件上传到我的服务器的表单.我看到Yesod使用fileAFormReq来实现这样的功能但是无法让它工作,遇到编译错误,其中最新的是:"没有实例(RenderMessage MySite t)"任何剥离的示例如何使用它将是非常感谢.谢谢,乌里

Tar*_*sch 13

2012年9月13日更新:

有官方维护帮助页面文件上传这里


谷歌搜索功能fileAFormReq给了我这个例子.

我只用了相关的部件制作了它的最小版本.

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes, TypeFamilies, TemplateHaskell, MultiParamTypeClasses #-}
import Yesod.Core
import Yesod.Form
import Yesod.Form.MassInput
import Control.Applicative
import Data.Text (Text, pack)
import Network.Wai.Handler.Warp (run)
import Data.Time (utctDay, getCurrentTime)
import qualified Data.Text as T
import Control.Monad.IO.Class (liftIO)

mkYesod "HelloForms" [parseRoutes|
/file FileR GET POST
|]

data HelloForms = HelloForms

instance RenderMessage HelloForms FormMessage where
    renderMessage _ _ = defaultFormMessage

instance Yesod HelloForms where
    approot _ = ""


main = toWaiApp HelloForms >>= run 3000

fileForm = renderTable $ pure (,)
    <*> fileAFormReq "Required file"
    <*> fileAFormOpt "Optional file"

getFileR = do
    ((res, form), enctype) <- runFormPost fileForm
    defaultLayout [whamlet|
<p>Result: #{show res}
<form method=post enctype=#{enctype}>
    <table>
        ^{form}
    <tr>
        <td>
            <input type=submit>
|]

postFileR = getFileR
Run Code Online (Sandbox Code Playgroud)

runhaskell这个,然后http://localhost:3000/file在您的浏览器中访问.

希望这可以帮助.:)


编辑:

哦等等,很明显你错过了什么.正如刚才所说的编译错误,你错过了RenderMessage你的基金会的一个实例.

我知道最近i18n的努力已经略微改变了form-package.如果您使用的是最新版本的yesod,请查看此信息.

我粘贴的代码使用旧的非i18n(默认意味着英文)版本的yesod-forms包.

  • 谢谢.缺少实例错误实际上是我没有正确使用fileAFormReq的副作用(导致ghc期望它有另一个RenderMessage实例而不仅仅是你指出的那个,这非常令人困惑).无论如何它现在完美无缺,谢谢! (2认同)