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

问题描述:

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

+0

嗨Uri,以防万一,我已经写了一篇关于如何编写完整文件上传的小博客文章(提供上传文件,在Yesod中引用它们并删除它们)https://ersocon.net/blog/2017/ 2/18/file-uploads-with-yesod – Alebon

更新13月 - 2012:

有一个官方维护帮助页面文件上传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的努力已经稍微改变了表格包。如果您使用的是最新版本的yesod,请检查this

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

+2

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