这里有一个数据上传的例子,用于说明如何操作文件上载。
HTTP表单数据主要采用以下两种编码格式:
- application/x-www-form-urlencoded (默认编码格式)
- multipart/form-data
如果要使用文件上传空间,则必须选择multipart/form-data
作为表单的enctype
编码类型。
完整的例子请查看Perfect文件上传例子
典型的HTML文件上传表单中编码类型声明应该像以下例子这样:
<form
method="POST"
enctype="multipart/form-data"
action="/upload">
<input type="file" name="filetoupload">
<br>
<input type="submit">
</form>
因为表单是POST方法,我们需要用.post
方法管理请求响应路由
var routes = Routes()
routes.add(
method: .post,
uri: "/upload",
handler: handler)
server.addRoutes(routes)
一旦对方请求内容完成文件传输,则我们可以使用请求句柄handler
:
// 通过操作fileUploads数组来掌握文件上传的情况
// 如果这个POST请求不是分段multi-part类型,则该数组内容为空
if let uploads = request.postFileUploads where uploads.count > 0 {
// 创建一个字典数组用于检查已经上载的内容
var ary = [[String:Any]]()
for upload in uploads {
ary.append([
"fieldName": upload.fieldName, //字段名
"contentType": upload.contentType, //文件内容类型
"fileName": upload.fileName, //文件名
"fileSize": upload.fileSize, //文件尺寸
"tmpFileName": upload.tmpFileName //上载后的临时文件名
])
}
values["files"] = ary
values["count"] = ary.count
}
如上所述,被上传的文件(一个或多个文件)可以用request.postFileUploads
数组表示,每个数组元素都有不同的属性,如fileName
文件名、fileSize
文件尺寸、tmpFileName
临时文件名等等。
因此我们可以创建一个目录来放置这些上传来的文件。该目录因安全考虑不会和webroot的根目录放在一起:
// 创建路径用于存储已上传文件
let fileDir = Dir(Dir.workingDir.path + "files")
do {
try fileDir.create()
} catch {
print(error)
}
下一步,在for upload in uploads
代码段,我们会执行文件转移的操作:
// 将文件转移走,如果目标位置已经有同名文件则进行覆盖操作。
let thisFile = File(upload.tmpFileName)
do {
let _ = try thisFile.moveTo(path: fileDir.path + upload.fileName, overWrite: true)
} catch {
print(error)
}
现在上传完毕的文件就可以按照原来的文件名转移到目标目录。