我是蒸汽初学者,我选择从Vapor 3-rc开始,因为它似乎打破了Vaport 2的变化。不幸的是,目前还没有完整的文档。
我目前正在尝试将一个简单的txt文件从Postman上传到我的Vapor 3本地服务器。
这是我的路线
let uploadController = FileUploadController()
router.post("uploadtxt", use: uploadController.uploadTXT)
和我的控制器
final class FileUploadController {
func uploadTXT(_ req: Request) throws -> Future<String> {
return try req.content.decode(MultipartForm.self).map(to: String.self, { form in
let file = try form.getFile(named: "txtfile")
return file.filename ?? "no-file"
})
}
}
首先,通过执行Postman请求,服务器返回:
{"error":true,"reason":"There is no configured decoder for multipart\/form-data; boundary=...}
通过调查源代码和limited documentation,似乎我应该声明一个解码器来支持多部分传入请求。
所以我做了:
var contentConfig = ContentConfig.default()
let decoder = FormURLDecoder()
contentConfig.use(decoder: decoder, for: .multipart)
services.register(contentConfig)
我使用FormURLDecoder
,因为它似乎是我最需要的类IMO,实施BodyDecoder
现在它在func decode<T>(_ type: T.Type) throws -> T where T: Decodable
的{{1}}中进行了infite-loops,而且我很少有网络资源。
答案 0 :(得分:3)
我结束了Vapor的松弛,这是一个找到一些信息的好地方。一点帮助。
解决方案非常简单。不要使用XXXXXXXXXXXXXXXXXXXX
IXXXXXXXXXXXXXXXXXXX!
I XXXXXXXXXXXXXXXXXg!
I lXXXXXXXXXXXXXXXng!
I loXXXXXXXXXXXXXing!
I lovXXXXXXXXXXXming!
I loveXXXXXXXXXmming!
I love XXXXXXXamming!
I love CXXXXXramming!
I love C-XXXgramming!
I love C-PXogramming!
I love C-Programming!
Final String = I love C-Programming!
,而是使用req.content.decode(MultipartForm.self)
:
MultipartForm.decode(from: req)
忘记服务注册我问题的一部分。