2011-09-18 11 views
8

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

+0

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

Odpowiedz

13

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.

+2

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! –