swift - Vapor 一次上传多个文件

标签 swift file-upload 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)
}

这很好用。现在,我尝试将 .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)
    }
}

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

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 中像这样上传你的文件 PostmanMultipleFiles

关于swift - Vapor 一次上传多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55131593/

相关文章:

file-upload - 使用 Content-Type multipart/form-data POST 数据

swift - Vapor 3解码内容: do/catch for multiple post formats?

swift - 如何将供应商/产品 ID 添加到 USB 匹配字典

javascript - 如何检查浏览器是否支持 HTML5 文件上传(FormData 对象)?

php - 如何在处理 ajax 请求时禁用拖放和浏览事件?

swift - 有什么简单的方法可以远程调试在(开发)服务器上运行的快速(vapor/perfect/kitura)应用程序?

swift - 服务器 Swift 与 mongodb 管理器单例

ios - Xcode swift : how to import a Swift project

swift - 如何使用gameplaykit将 Sprite 分配给场景编辑器中的实体

ios - 后台获取间歇性数据丢失 - NSKeyedUnarchiver 可以从文档目录返回 nil 吗?