蒸气一次上传多个文件

Lin*_*rth 6 file-upload swift vapor

我想在一个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)
}
Run Code Online (Sandbox Code Playgroud)

这样很好。现在,我尝试更改.decode(File.self).decode([File].self),并对所有文件进行循环。
尝试使用data[]Postman中的参数上传图像时,出现以下错误:

不支持嵌套的表单数据解码。

我该如何解决?

imi*_*ike 7

以下示例运行良好,已经经过多次测试

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你也可以在函数参数中声明你的有效载荷

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)
}
Run Code Online (Sandbox Code Playgroud)

唯一的区别是在路由器上声明端点​​功能

router.post("upload", use: myUpload)
Run Code Online (Sandbox Code Playgroud)

router.post(MyPayload.self, at: "upload", use: myUpload)
Run Code Online (Sandbox Code Playgroud)

然后在邮递员中上传您的文件,像这样 邮递员多文件