【问题标题】:How to upload a file to the server using Yesod如何使用 Yesod 将文件上传到服务器
【发布时间】:2012-09-14 05:11:42
【问题描述】:

我正在尝试编写一个允许用户将文件上传到我的服务器的表单。 我看到 Yesod 使用 fileAFormReq 来实现这样的功能,但无法让它工作,遇到编译错误,最新的是: “(RenderMessage MySite t)没有实例” 任何关于如何使用它的精简示例都将受到高度赞赏。 谢谢, 乌里

【问题讨论】:

标签: haskell file-upload yesod


【解决方案1】:

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

希望这会有所帮助。 :)


编辑:

哦,等等,很明显你缺少什么。正如刚才所说的编译错误,您的 Foundation 缺少一个 RenderMessage 实例。

我知道最近为 i18n 所做的努力稍微改变了 forms-package。如果您使用的是最新版本的 yesod,请查看this

我粘贴的代码使用了旧的非 i18n(默认为英文)版本的 yesod-forms 包。

【讨论】:

  • 谢谢。缺少实例错误实际上是我没有正确使用 fileAFormReq 的副作用(导致 ghc 期望它有另一个 RenderMessage 实例,而不仅仅是你指出的那个,这非常令人困惑)。无论如何,它现在完美运行,所以谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2017-04-25
  • 1970-01-01
  • 2016-06-18
相关资源
最近更新 更多