我正在尝试编写一个允许用户将文件上传到我的服务器的表单。 我看到Yesod使用fileAFormReq来实现这样的功能,但无法让它工作,遇到编译错误,最新的错误是: “(RenderMessage MySite t)没有实例” 任何有关如何使用它的精简示例都将受到高度赞赏。 谢谢, URI
答案 0 :(得分:13)
2012年9月13日更新:
有一个官方维护的文件上传帮助页面here
使用fileAFormReq
功能搜索我example。
我只用相关部分制作了它的最小版本。
{-# 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
runhaskell
这个,然后在浏览器中访问http://localhost:3000/file
。
希望这会有所帮助。 :)
编辑:
等等,很明显你错过了什么。正如刚才所说的编译错误,你错过了基金会的RenderMessage
实例。
我知道最近i18n的努力已经略微改变了form-package。如果您使用的是最新版本的yesod,请检查this。
我粘贴的代码使用旧的非i18n(默认意味着英文)版本的yesod-forms
包。