Как читать содержимое загруженного файла
Я пытаюсь загрузить CSV-файл и проанализировать его в таблицу, которая в конечном итоге будет сохранена в БД. Я играл с примером загрузки файла Yesod, но я не могу заставить его работать с последней версией Yesod. Я использую Yesod 1.2.5.2 and GHC 7.6.3 on Ubuntu 14.04
.
Ниже приведен мой код
fileUploadForm :: Form ((Key Account), FileInfo)
fileUploadForm = renderDivs $ (,)
<$> areq (selectField accounts) "Account" Nothing
<*> fileAFormReq "Choose a file"
where
accounts = do
entities <- runDB $ selectList [] [Asc AccountName]
optionsPairs $ map (s -> (accountName $ entityVal s, entityKey s)) entities
getUploadTransactionR :: Handler Html
getUploadTransactionR = do
(widget, enctype) <- generateFormPost fileUploadForm
defaultLayout $ do
setTitle "Upload new file."
$(widgetFile "upload_transactions")
Это та часть, в которой я хотел бы получить вашу помощь:
postUploadTransactionR :: Handler Html
postUploadTransactionR = do
((result, widget), enctype) <- runFormPost fileUploadForm
case result of
FormSuccess (account, fi) -> do
-- ??? I would like to get the contents of fi and send it to a CSV parser.
-- (fileSourceRaw fi)???
redirect (HomeR)
_ -> return ()
defaultLayout $ do
$(widgetFile "upload_transactions")
Как только у меня будет ByteString, я буду использовать данные.Csv для разбора его как такового: decode NoHeader s :: Either String (Vector (Vector ByteString))
Может ли кто-нибудь дать мне знать, как я могу получить содержимое файла из загруженного файла? Мне не нужно хранить файл на диске.
Спасибо!
1 ответ:
Вот что я делаю:
postSomethingR = do ((res, _), _) <- runFormPost form case res of FormSuccess (account, file) -> do bytes <- runResourceT $ fileSource file $$ sinkLbs -- Parse the ByteString in another thread parseHandler <- handlerToIO liftIO $ forkIO $ parseHandler $ do case CSV.parseCSV csvSettings (decodeUtf8 . toStrict $ bytes) of Left err -> ... Right vector -> runDB $ do ...
Извините, я отправляю это с мобильного телефона.