Próbuję napisać formularz, który pozwala użytkownikom przesłać plik na mój serwer. Widziałem, że Yesod używa fileAFormReq dla takiej funkcjonalności, ale nie był w stanie uruchomić go z błędami kompilacji, z których najnowszy był: "Brak instancji dla (RenderMessage MySite t)" Dowolny przykładowy opis użycia będzie to bardzo cenne. Dzięki, UriJak przesłać plik na serwer za pomocą Yesod
Odpowiedz
Aktualizacja 13-Sep-2012:
Urzędowe utrzymany stronę pomocy dla przesyłania pliku here
Googling funkcję fileAFormReq
dał mi ten example.
Wykonałem minimalną wersję z tylko odpowiednimi częściami.
{-# 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
to a następnie odwiedzić http://localhost:3000/file
w przeglądarce.
Mam nadzieję, że to pomoże. :)
Edit:
Oh wait, to jest oczywiste, co tracisz. Jak już powiedział błąd kompilacji, brakuje Ci instancji RenderMessage
dla swojej Fundacji.
Wiem, że ostatnie wysiłki na rzecz i18n zmieniły nieznacznie formę-pakietu. Jeśli używasz najnowszej wersji yesod, sprawdź this na zewnątrz.
Kod wklejony używa starej wersji innej niż i18n (domyślnie oznacza angielską) pakietu yesod-forms
.
Dzięki. Brakujący błąd wystąpienia był tak naprawdę efektem ubocznym, że nie używam poprawnie fileAFormReq (w wyniku czego ghc spodziewa się, że ma on inną instancję RenderMessage, a nie tylko tę, którą wskazałeś , co było bardzo mylące). W każdym razie teraz działa idealnie, więc dzięki! –
Witam Uri, na wszelki wypadek napisałem mały wpis na blogu, w jaki sposób napisać kompletny plik do pobrania (serwowanie przesłanych plików, odnoszenie ich do Yesod i usuwanie ich) https://ersocon.net/blog/2017/ 2/18/file-uploads-with-yesod – Alebon