如何使用 Vapor 3 处理多部分请求

2024-04-30

我是一名 Vapor 初学者,我选择从 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=...}

通过研究源代码和有限的文档 https://docs.vapor.codes/3.0/getting-started/content/#configuring-content关于这一点,似乎我应该声明一个解码器来支持多部分传入请求。

所以我做了:

var contentConfig = ContentConfig.default()
let decoder = FormURLDecoder()
contentConfig.use(decoder: decoder, for: .multipart)
services.register(contentConfig)

I used FormURLDecoder因为在我看来,它似乎是最适合我的需求的课程,实施BodyDecoder

现在它无限循环进入func decode<T>(_ type: T.Type) throws -> T where T: Decodable of FormURLSingleValueDecoder,我被困在这里,网络资源很少。


我最后选择了 Vapor slack,这是一个寻找一些信息和帮助的好地方。

The solution is quite simple. Instead of using req.content.decode(MultipartForm.self), prefer use MultipartForm.decode(from: req) (...deleted code sample)

EDIT:

正如@axello 所说,MultipartForm不存在了。我现在正在使用req.content.decode(...)解析多部分数据的方法。这个想法是创建一个反映 HTML 表单输入的对象。 Codable 会神奇地为您将数据映射到对象中。

例如,使用这种形式:

<form method="POST" action="upload" enctype="multipart/form-data" class="inputForm">
     <input type="name" name="filename">
     <input type="file" name="filedata">
     <input type="submit" name="GO" value="Send" class="send">
</form>

我创建了这个小结构

fileprivate struct MyFile: Content {
    var filename: String
    var filedata: Data
}

并且,在我的控制器中:

func uploadTXT(_ req: Request) throws -> Future<String> {
    return try req.content.decode(MyFile.self).map(to: String.self, { myFile in
        let filename = myFile.filename // this is the first input
        // ... and the second one:
        guard let fileContent = String(data: myFile.filedata, encoding: .utf8) else {
            throw Abort(.badRequest, reason: "Unreadable CSV file")
        }
        print(fileContent)
        return filename
    })
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Vapor 3 处理多部分请求 的相关文章

随机推荐

  • C# 中是否存在异步正则表达式?它们对我的情况有帮助吗?

    我的应用程序使用正则表达式并行搜索许多文件 await Task WhenAll filePaths Select FindThings 代替FindThings 它花费大部分时间执行正则表达式搜索 因为这些文件的大小可能有数百MB sta
  • 如何从 Dart 中的 Uint8List 读取 16 位 int?

    我有一个二进制数据存储在 Uint8List 中 我想从该列表中读取一个 16 位 int 有什么方便的方法可以帮助解决这个问题吗 摘自我和同事的对话 您可以使用 ByteData 类 var buffer new Uint8List 8
  • 如何从类中排除某些字符?

    假设我想匹配一个 单词 字符 w 但排除 或匹配空白字符 s 但排除 t 我怎样才能做到这一点 使用包含 W 或 S 的否定类 W anything that s not a non word character and not S t a
  • 我需要在 header("Location: http://localhost/..."); 之后使用 exit 吗?

    我正在创建一个脚本来验证表单 并且我问自己一个问题 当我使用标头 参见下面的示例 时 我需要立即使用 exit 吗 我的意思是 使用 header 是否也意味着它默认退出 因此我不需要使用命令 exit cancel button clic
  • Vagrant 的端口转发不起作用[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在最后遇到了一个小问题入门指南vagrant http vagrantup com docs getting started ports html
  • 可滚动 Turbo 表中的 PrimeNG 过滤器下拉问题

    在 prime ng Turbo Table 中 当我们将过滤器下拉列表放入表内的可滚动表下拉列表中时 没有可滚动表下拉菜单就完美了 这工作完美 https i stack imgur com 16vjy png 但是当可滚动表格时 下拉菜
  • gdi+ 中的半色调效果

    我该如何去模仿this http www juicybitssoftware com halftone GDI 中的半色调效果 它几乎看起来像弗洛伊德 斯坦伯格 http en wikipedia org wiki Floyd E2 80
  • Android TextView 更改文本大小后不调整大小

    我有一个ListView对该行进行一些自定义布局 一张图像 然后使用两个TextView在垂直方向上LinearLayout 参见下面的代码 我的问题是 当我动态更改文本大小时 在getView的方法Adapter 文字大小确实改变了 但是
  • Java中StringBuilder如何逆向工作?

    我正在尝试解决这个leetcode问题https leetcode com problems palindrome linked list https leetcode com problems palindrome linked list
  • java-websocket的WebSocketServer使用什么草案?

    我无法从WebSocketServer java源码 https github com TooTallNate Java WebSocket blob master src main java org java websocket serv
  • 生成实体密钥

    我第一次对 Entity Framework 4 感到失望 事实证明 当 SQL CE 与 EF4 一起使用时 不支持自动生成主键 http social msdn microsoft com forums en US sqlce thre
  • 二分图中最小顶点覆盖算法

    我正在尝试找出一种算法来查找二分图的最小顶点覆盖 我正在考虑一个解决方案 将问题减少到二分图中的最大匹配 众所周知 可以使用从 bip 创建的网络中的最大流量来找到它 图形 最大匹配 M 应确定最小匹配 顶点覆盖 C 但我无法处理选择顶点来
  • 关于 JavaScript for() 循环巫毒

    在相当长的一段时间里 我一直有这样的印象 for循环可能存在solely采用以下格式 for INITIALIZER STOP CONDITION INC DEC REMENTER CODE 然而 这是最绝对事实并非如此 看看这个 Java
  • `SwaggerRequestExample` 被忽略

    当我向 API 添加 swagger 时 我想要获取默认值和响应示例 我添加了 NuGet 包并尝试遵循本教程 https mattfrear com 2016 01 25 generating swagger example reques
  • Shell Linux:grep 带有 NULL 字符的精确句子

    我有一个像这样的文件 key 0value n akey 0value n key2 0value n 我必须创建一个以单词作为参数的脚本 我必须返回具有与参数完全相同的键的每一行 I tried grep aF key x0 但 grep
  • python raw_input 带有包含字符串的重音符号的奇怪行为

    我正在编写一个程序 要求用户输入包含重音符号的输入 测试用户输入字符串以查看其是否与程序中声明的字符串匹配 如下所示 我的代码无法正常工作 code coding utf 8 testList m myInput raw input ent
  • 有没有办法在网站中嵌入维基百科文章并设置其样式?

    我想做的基本上是一个 div 元素 其中包含维基百科文章的打印友好版本 我使用 iframe 来嵌入文章并且它可以工作 尽管我无法设置文档的样式 我想这是因为 iframe 内容不在我的域中并且我没有编辑权限 有没有办法在加载 iframe
  • NPM 安装“在 M1 芯片上找不到模块‘node-darwin-arm64/package.json’”

    我知道这个问题已经被问到了不同的版本 但我还没有看到一个不涉及使用 Rosetta 安装或使用 zsh 伪造架构的解决方案 我使用 bash 并希望尽可能不处理 Rosetta 我是一个节点新手 正在努力找出失败的原因 节点 v16 14
  • 使用 ajaxFileUpload 上传具有不同文件 ID 的多个文件

    我正在尝试以同一表单上传多个文件 多个文件应该位于不同的字段中 我对单个文件使用 ajaxfileuploader 并使用 MultipartHttpServletRequest 接收它 它成功了 I used ajaxFileUpload
  • 如何使用 Vapor 3 处理多部分请求

    我是一名 Vapor 初学者 我选择从 Vapor 3 rc 开始 因为它似乎破坏了 Vaport 2 的更改 不幸的是 目前还没有完整的文档 我目前正在尝试将一个简单的 txt 文件从 Postman 上传到我的 Vapor 3 本地服务