跳轉到內容

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 圖片,瀏覽器就會顯示它。

華夏公益教科書