8

ユーザーが自分のサーバーにファイルをアップロードできるフォームを作成しようとしています。Yesodがそのような機能にfileAFormReqを使用しているのを見ましたが、それを機能させることができず、コンパイルエラーが発生しました。最新のエラーは、「(RenderMessage MySite t)のインスタンスはありません」です。高く評価。ありがとう、ウリ

4

1 に答える 1

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

runhaskellhttp://localhost:3000/fileこれを確認してから、ブラウザでアクセスしてください。

お役に立てれば。:)


編集:

ちょっと待って、何が欠けているかは明らかです。コンパイル エラーが言ったRenderMessageように、Foundation のインスタンスがありません。

i18n の最近の取り組みにより、forms-package がわずかに変更されたことは知っています。yesod の最新バージョンを使用している場合は、こちらを確認てください。

貼り付けたコードは、古い非 i18n (デフォルトは英語) バージョンのyesod-formsパッケージを使用しています。

于 2011-09-18T09:50:42.227 に答える