2014-09-29 85 views
4

我正在使用默認的Yesod腳手架項目。
我創建了一個顯示上傳文件的簡單表單的頁面。
(形式將可能使用Javascript在客戶機上創建的。)
爲簡潔起見,形式有一個單一的文件輸入:如何使用Yesod和Http-Conduit將FileInfo發佈到Web服務?

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

我的目標是處理表單數據,然後將文件上傳到一個Web服務。
我在處理表單時沒有問題,我擔心的是與Web服務交互。
例如,給出以下耶索德處理程序:

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

WebService的返回錯誤:fail post content-length,但一切工作正常。也許服務器不支持分塊的請求體?

回答

2

我認爲你對分塊請求體的猜測是正確的。你需要做的是:

  • 上傳的內容流到一個臨時文件。
  • 獲取該文件的大小。使用requestBodySource並提供文件長度及其內容。

幸運的是,步驟(1)和(2)可以通過sinkCacheLength函數很容易地處理。你會最終得到類似的東西:

(fSize, fSource) <- fileSource fi $$ sinkCacheLength 
相關問題