2010-11-18 2 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というファイルをアップロードしようとしますが、内容がsomething.zip(テキストとして書かれています)のgsというファイルを取得します。

私は問題は、getInputFilename "ファイル"またはgetInputFPSは何も返されないが、私は理由を知っていないと思う。

フォームやプログラムに問題はありますか?

+1

? –

+0

@Antal:おそらく、* getInputFileName *は[Network.CGI](http://www.haskell.org/haskellwiki/Practical_web_programming_in_Haskell)モジュールから来ます。 – frayser

答えて

1

問題は元のコード1を使用していることです。POST;質問のHTMLフォームでは、代わりにGETが使用されます。修正は、GETPOSTに変更することです。それは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:ウェブ/文学/実用的なWebプログラミングハスケル

で `getInputFilename`から来たん