Как загрузить файл на сервер, используя Yesod - PullRequest
8 голосов
/ 18 сентября 2011

Я пытаюсь написать форму, которая позволяет пользователям загружать файл на мой сервер. Я видел, что Yesod использует fileAFormReq для такой функциональности, но не смог заставить его работать, из-за ошибок компиляции, последняя из которых была: "Нет экземпляра для (RenderMessage MySite t)" Любой урезанный пример того, как его использовать, будет высоко оценен. Спасибо, Uri

1 Ответ

13 голосов
/ 18 сентября 2011

Обновление 13 сентября 2012 г .:

Официальная страница справки для загрузки файла здесь


Поиск в Googleфункция 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

runhaskell это и затемпосетите http://localhost:3000/file в вашем браузере.

Надеюсь, это поможет.:)


Редактировать:

Ой, подождите, очевидно, что вы упускаете.Как только что сказала ошибка компиляции, вам не хватает экземпляра RenderMessage для вашего Foundation.

Я знаю, что последние попытки для i18n немного изменили пакет форм.Если вы используете последнюю версию yesod, проверьте this out.

Вставленный мною код использует старую не-i18n (по умолчанию означает английский) версию пакета yesod-forms.

...