2011-09-18 19 views
8

Kullanıcıların sunucuma bir dosya yüklemesine izin veren bir form yazmaya çalışıyorum. Yesod, böyle bir işlev için fileAFormReq'i kullandığını ancak en son çalıştığı derleme hatalarıyla çalışmayı başaramadığını fark etti: "RenderMessage MySite t için örnek yok" Nasıl kullanılacağı konusunda herhangi bir örnek yok çok takdir edilecektir. sayesinde UriYesod kullanarak sunucuya nasıl dosya yükleyebilirim

+0

Merhaba Uri, tam bir dosya yüklemesinin nasıl yazılacağı (yüklenen dosyalar sunarak, bunları Yesod'a gönderme ve silme) hakkında küçük bir blog yazısı yazdım https://ersocon.net/blog/2017/ 2/18/file-uploads-with-yesod – Alebon

cevap

13

Güncelleme 13-Eylül-2012: yoktur

resmi bana bu example verdi fonksiyonu fileAFormReq üzerinde Googling here


yükleyerek dosya için yardım sayfasını korudu.

Sadece ilgili kısımlarla en az bir sürümünü yaptım.

{-# 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 bu ve sonra tarayıcınızda http://localhost:3000/file ziyaret edin.

Bu yardımcı olur umarım. :)


Düzenleme:

Ah bekle, ne eksik açıktır. Derleme hatası dediğiniz gibi, Vakfınız için bir RenderMessage örneğini kaçırıyorsunuz.

i18n için son çabaların form paketini biraz değiştirdiğini biliyorum. En son yesod sürümünü kullanıyorsanız, this adresini kontrol edin.

Yapıştırdığım kod, yesod-forms paketinin eski i18n olmayan (varsayılan ingilizce anlamına gelir) sürümünü kullanır.

+2

Teşekkürler. Eksik örnek hatası aslında benim dosyaAFormReq kullanmamanın bir yan etkisiydi (ghc'yi başka bir RenderMessage örneğinin olmasını bekledim ve sadece işaret ettiğin değil. çok kafa karıştırıcıydı. Her neyse, şimdi mükemmel çalışıyor, teşekkürler! –

İlgili konular