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 图片,浏览器就会显示它。