2013-02-12 95 views
0

我很難將POST響應(多部分)分開,應該如何將發送到Yesod服務器的某些文件的內容放入數據庫(在進一步處理之後)。我目前的代碼:將POST請求分解爲Yesod部分

import qualified Data.ByteString.Lazy as LZ 
import qualified Data.ByteString.Lazy.Char8 as LC 
... 
processLines :: String -> [String] -> String 
processLines delim (l:rest) = do 
    case l of 
     delim -> "" 
     _  -> l ++ "\n" ++ processLines delim rest 

processFile :: [String] -> String 
processFile (delim:some:other:line:txt) = processLines delim txt 

postImpexR :: SystemsId -> Handler RepPlain 
postImpexR sysid = do 
    wr <- waiRequest 
    bss <- lift $ requestBody wr $$ consume 
    let file = LZ.fromChunks bss 
   return $ RepPlain $ toContent $ processFile $ map LC.unpack $ LC.lines file 

編輯:管理修復一個問題,似乎我正在理解處理程序的方式。這裏的類型有什麼問題?有沒有比這更完美的方式來完成這件事?

回答

1

如果您正在尋找多部分支持,那是內置於Yesod的,不需要手動解析。考慮使用fileFieldlookupFile

+0

非常感謝。似乎我得到正確的信息最麻煩。 – user2054578 2013-02-12 20:06:24

+0

好的,但是當我在處理程序中使用fInfo < - lookupFiles時,它需要一個額外的文本參數。如果我追加「文件名」(作爲POST參數名稱),我得到一個空列表。 – user2054578 2013-02-13 08:56:59

+0

我無法解釋爲什麼發生這種情況時不知道請求的細節,但應完全支持文件上傳。如果有問題,那麼你應該提交一份錯誤報告。 – 2013-02-13 09:48:33