Как читать содержимое загруженного файла


Я пытаюсь загрузить 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 2

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 ...

Извините, я отправляю это с мобильного телефона.