2013年12月2日 星期一

[懷舊] 開發 cgi 程式 (1) 使用一個 form 上傳多個檔案

看到 picasaweb 可以使用一個 form 來選擇多個檔案, 這真是很方便的功能, 我想「知道」這是怎麼做的?

首先當然要來一個 html form 可以讓使用者選擇多個檔案。

mf.html
 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 3 <!
 4 ref: http://stackoverflow.com/questions/3448117/
 5 can-perls-cgi-pm-process-firefoxs-input-type-file-multiple-form-fields
 6 -->
 7 <html>
 8   <head>
 9     <title>Multiple file upload test</title>
10   </head>
11 
12   <body>
13     <form action="http://127.0.01/cgi-bin/cgi1" 
14           method="post" 
15           enctype="multipart/form-data">
16       <input type="file" 
17             name="multiple_files" 
18             multiple="true"/>
19       <button type="submit">Submit</button>
20     </form>
21   </body>
22 </html>

L18 就是可以一次選取多個檔案的關鍵, 這樣在選取檔案時, 就可以依據 shift, ctrl 來選取多個檔案。



從 wiresharek 可以觀察到多個檔案如何被封裝起來, 123\n, zyx\n, 1q2w\n, 是我上傳的 3 個檔案的內容, 透過
boundary= "------- 1316" 

來分割這三個部份, 取出每一段的檔名資訊, 檔案的內容, 依據檔名存檔, 這樣就完成了。說來簡單, 不過程式花了我一番功夫才正確運作。

source code:
https://github.com/descent/cgi_src

ref:
HTTP 檔案上傳機制解析 [精華]
http://stackoverflow.com/questions/3448117/can-perls-cgi-pm-process-firefoxs-input-type-file-multiple-form-fields
http 上傳檔案的容量限制

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。