2010-11-18 73 views
1

我有一個表格:哈斯克爾CGI Web編程幫助

<div id="form"> 
    <form action="upload.cgi" method="get" enctype="multipart/form-data"> 
     <input type="file" name="file" id="file"/> 
     <input type="submit" value="Upload"/> 
    </form> 
</div> 

和upload.cgi是:

saveFile n = 
    do cont <- liftM fromJust $ getInputFPS "file" 
     let f = uploadDir ++ "/" ++ basename n 
     liftIO $ writeFile f cont 
     return $ paragraph << ("Saved") 

uploadDir = "./uploadDirectory"   
basename = reverse . takeWhile (`notElem` "/\\") . reverse 
page t b = header << thetitle << t +++ body << b 


myFromJust (Just a) = a 
myFromJust Nothing = "gs" 


cgiMain = do 
      mn <- getInputFilename "file" 
      h <- saveFile (myFromJust mn) 
      output . renderHtml $ page "Saved" h 

main = runCGI $ handleErrors cgiMain 

的問題是,每次我試着上傳文件,而不是保存該文件中,創建一個名爲gs的文件(從myFromJust函數中,如果我使用fromJust,我得到Nothing並且程序失敗),其內容是上傳的文件名。

因此,我嘗試上傳一個名爲something.zip的文件,我得到一個名爲gs的文件,其內容是something.zip(寫成文本)。

我認爲問題是getInputFilename「file」或getInputFPS不會返回任何內容,但我不知道爲什麼。

表單或程序有問題嗎?

+1

編程哪裏'getInputFilename'從何而來? – 2010-11-18 16:28:15

+0

@Antal:* getInputFileName *很可能來自模塊[Network.CGI](http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell)。 – frayser 2010-11-18 18:08:14

回答

1

問題是,原代碼1使用POST;但是在問題的HTML表單中,代替使用了HTML GET。修復方法是在HTML中將GET更改爲POST

從那裏使用HTTP POST original example

fileForm = 
    form ! [method "post" 
      , enctype "multipart/form-data"] 
      << [afile "file", submit "" "Upload"] 

新表(以下部分),在其中不當使用GET。

<form action="upload.cgi" 
     method="get" enctype="multipart/form-data"> 

注意
1見第9節:網絡/文學/實用的網頁在哈斯克爾