2013-02-12 2 views
0

Я изо всех сил пытаюсь разделить ответ POST (multipart), что должно использоваться, чтобы поместить содержимое некоторых файлов, отправленных на сервер 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, нет необходимости прибегать к ручному разбору. Рассмотрим использование fileField или lookupFile.

+0

Большое спасибо. Кажется, у меня больше всего проблем с получением правильной информации. – user2054578

+0

ОК, но когда я использую fInfo <- lookupFiles в обработчике, он хочет добавить дополнительный текстовый аргумент. Если я добавлю «filename» (как имя параметра POST), я получаю пустой список. – user2054578

+0

Я не могу объяснить, почему это происходит, не зная деталей запроса, но загрузка файлов должна быть полностью поддержана. Если что-то не так, тогда вы должны подать отчет об ошибке. –

Смежные вопросы