Karrigell/上傳檔案
外觀
建立另一個名為 upload.py 的指令碼
def index():
form = FORM(action="upload",method="post",enctype="multipart/form-data")
form <= INPUT(Type="file",name="src")
form <= INPUT(Type="submit",value="Ok")
return HTML(BODY(form))
def upload(src):
import mimetypes
gtype,encoding = mimetypes.guess_type(src.filename)
RESPONSE_HEADERS['Content-type'] = gtype
data = src.file.read()
return data
函式 index() 類似於之前的示例。變化之處在於 FORM 的 `enctype` 引數設定為 "multipart/form-data";以及第一個 INPUT 欄位的型別。
在 upload 函式中,我們接收引數 `src`。由於它作為 multipart/form-data 表單中的檔案傳送,因此該物件具有一個名為 filename 的屬性,與上傳檔案的名稱匹配;它還具有一個名為 file 的屬性,這是一個類檔案物件,具有一個名為 read() 的方法,該方法返回位元組。
Python 模組 mimetypes 可以根據檔案的副檔名猜測該檔案的型別;例如,如果上傳的檔案是 JPEG 影像,副檔名為 `.jpg`,則 mimetypes.guess_type(src.filename) 的結果將為 "image/pjpeg"。
這一行
RESPONSE_HEADERS['Content-type'] = gtype
引入了另一個名稱,該名稱始終在 Karrigell 執行的 Python 指令碼中可用:RESPONSE_HEADERS。它是一個類似於字典的物件(實際上是類 email.message.Message 的例項),用於設定將傳送到 Web 瀏覽器的響應頭。在這裡,這行程式碼將 Content-type 頭設定為接收到的檔案的型別。
在下一行中,我們從 src 的 "file" 屬性讀取二進位制資料,最後返回此二進位制資料。Karrigell 引擎傳送響應頭,然後傳送二進位制資料;有了這些資訊,瀏覽器就可以以適當的格式呈現檔案內容:如果檔案是 JPEG 圖片,瀏覽器就會顯示它。