Vapor 一次上传多个文件
Vapor upload multiple files at once
我想在一个 POST 请求中上传多张图片。目前,我的请求中与文件上传相关的部分正在获取一个文件,如下所示:
return try req.content.decode(File.self).flatMap(to: Image.self) { (file) in
try file.data.write(to: URL(fileURLWithPath: DirectoryConfig.detect().workDir + localImageStorage + file.filename))
return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req)
}
这很好用。现在,我尝试将 .decode(File.self)
更改为 .decode([File].self)
,并对所有文件进行循环。
尝试在 Postman 中使用 data[]
参数上传图片时,出现以下错误:
Nested form-data decoding is not supported.
我该如何解决这个问题?
下面的示例运行良好,已经测试了多次
struct MyPayload: Content {
var somefiles: [File]
}
func myUpload(_ req: Request) -> Future<HTTPStatus> {
let user: User = try req.requireAuthenticated()
return try req.content.decode(MyPayload.self).flatMap { payload in
let workDir = DirectoryConfig.detect().workDir
return payload.somefiles.map { file in
let url = URL(fileURLWithPath: workDir + localImageStorage + file.filename)
try file.data.write(to: url)
return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req).transform(to: ())
}.flatten(on: req).transform(to: .ok)
}
}
顺便说一句,您也可以在函数 params
中准确声明您的有效负载
func myUpload(_ req: Request, _ payload: MyPayload) -> Future<HTTPStatus> {
let user: User = try req.requireAuthenticated()
let workDir = DirectoryConfig.detect().workDir
return payload.somefiles.map { file in
let url = URL(fileURLWithPath: workDir + localImageStorage + file.filename)
try file.data.write(to: url)
return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req).transform(to: ())
}.flatten(on: req).transform(to: .ok)
}
唯一的区别在于在路由器上声明端点函数
router.post("upload", use: myUpload)
对
router.post(MyPayload.self, at: "upload", use: myUpload)
然后在 Postman 中像这样上传你的文件
我想在一个 POST 请求中上传多张图片。目前,我的请求中与文件上传相关的部分正在获取一个文件,如下所示:
return try req.content.decode(File.self).flatMap(to: Image.self) { (file) in
try file.data.write(to: URL(fileURLWithPath: DirectoryConfig.detect().workDir + localImageStorage + file.filename))
return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req)
}
这很好用。现在,我尝试将 .decode(File.self)
更改为 .decode([File].self)
,并对所有文件进行循环。
尝试在 Postman 中使用 data[]
参数上传图片时,出现以下错误:
Nested form-data decoding is not supported.
我该如何解决这个问题?
下面的示例运行良好,已经测试了多次
struct MyPayload: Content {
var somefiles: [File]
}
func myUpload(_ req: Request) -> Future<HTTPStatus> {
let user: User = try req.requireAuthenticated()
return try req.content.decode(MyPayload.self).flatMap { payload in
let workDir = DirectoryConfig.detect().workDir
return payload.somefiles.map { file in
let url = URL(fileURLWithPath: workDir + localImageStorage + file.filename)
try file.data.write(to: url)
return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req).transform(to: ())
}.flatten(on: req).transform(to: .ok)
}
}
顺便说一句,您也可以在函数 params
中准确声明您的有效负载func myUpload(_ req: Request, _ payload: MyPayload) -> Future<HTTPStatus> {
let user: User = try req.requireAuthenticated()
let workDir = DirectoryConfig.detect().workDir
return payload.somefiles.map { file in
let url = URL(fileURLWithPath: workDir + localImageStorage + file.filename)
try file.data.write(to: url)
return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req).transform(to: ())
}.flatten(on: req).transform(to: .ok)
}
唯一的区别在于在路由器上声明端点函数
router.post("upload", use: myUpload)
对
router.post(MyPayload.self, at: "upload", use: myUpload)
然后在 Postman 中像这样上传你的文件