2010-11-18 72 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节:网络/文学/实用的网页在哈斯克尔