2014-09-29 2 views
4

Я работаю со стандартным проектом Yesod scaffolding.
Я создал страницу, которая отображает простую форму для загрузки файлов.
(форма, скорее всего, будет создан на клиенте с помощью Javascript.)
Для краткости, форма имеет один входной файл:Как отправить FileInfo в веб-службу с помощью Yesod и Http-Conduit?

<form method="post" [email protected]{UploadR}> 
    <input type="file" name="myfile"> 
    <button type="submit"> 

Моя цель заключается в обработке данных формы, а затем загрузить файл веб-службы.
У меня нет проблем с обработкой формы, моя проблема связана с веб-службой.
Например, если следующий обработчик Есод:

postUploadR :: Handler Html 
postUploadR = do 
    mgr <- fmap httpManager getYesod 
    fi <- runInputPost $ ireq fileField "myfile" 
    let fSource = fileSource fi 
     fName = fileName fi 
    req <- parseUrl "http://webservice/upload" 
    let areq = req { method = methodPost 
        , requestBody = requestBodySourceChunked fSource 
        } 
    res <- httpLbs areq mgr 
    defaultLayout $ do 
     setTitle "file uploaded" 
     [whamlet| 
     <h3> Success 
     <p> You uploaded #{fName}. 
     |] 

вебсервис возвращает ошибку: fail post content-length, но все остальное работает, как ожидалось. Возможно, сервер не поддерживает кусок запроса?

ответ

2

Я думаю, что ваше предположение о правильном корпусе запроса. Что вам нужно сделать:

  • Поток загруженного содержимого во временный файл.
  • Получить размер этого файла.
  • Используйте requestBodySource и укажите длину файла и его содержимое.

К счастью, шаги (1) и (2) могут быть легко обработаны функцией sinkCacheLength. Вы получите что-то вроде:

(fSize, fSource) <- fileSource fi $$ sinkCacheLength