当前位置: 首页 > 知识库问答 >
问题:

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

宿建本
2023-03-14

我是vapor的初学者,我选择vapor 3-rc作为开始,因为它似乎打破了vapor 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"
        })
    }
}

首先,通过执行邮递员请求,服务器返回:

{"error":true,"reason":"There is no configured decoder for multipart\/form-data; boundary=...}

通过研究源代码和关于此的有限文档,我似乎应该声明一个解码器来支持多部分传入请求

所以我做到了:

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

我使用FormURLDecoder,因为它似乎是最符合我需求的类,实现了BodyDecoder

现在它将循环到func decode

共有1个答案

唐宇定
2023-03-14

我在Vapor slack结束了,这是一个查找信息的好地方

解决方案非常简单。与其使用 req.content.decode(MultipartForm.self),不如使用 MultipartForm.decode(from: req)(...已删除的代码示例)

编辑:

AS@axello说,MultipartForm不再存在。我现在使用req.content.decode(...)方法来解析多部分数据。这个想法是创建一个反映您的超文本标记语言表单输入的对象。Coable将神奇地为您将数据映射到对象中。

例如,使用此表单:

<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
    })
}
 类似资料:
  • 我正在传递多部分文件与其他用户信息。无法将类型的属性值转换为属性嵌套异常为 下面的代码我已经试过了 控制器类 @RequestMapping(value=RestMappingURLS.user.saveUser,headers={“Content-Type=Multipart/Mixed”,“Content-Type=Multipart/Form-Data”})public RestRespon

  • 这其实不是一个问题,然而,我想在这里分享一些我的工作代码,供您需要时参考。 正如我们所知,从API22中不推荐使用,并且从API23开始被删除。目前,我们无法在Android Developer上访问HttpEntity引用(404)。因此,下面是使用Volley而不使用HttpEntity的POST多部分请求的工作示例代码。通过测试,它正在工作。当然,该代码可能只是一个发布两个已有的可绘制文件的

  • 问题内容: 我在用Java应用程序服务器处理multipart / form-data请求时非常困难。从我发现的情况来看,servlet 3.0规范提供了诸如HttpServletRequest.getParts()之类的方法,这对于处理上传到我的servlet的表单数据是理想的。 但是,此方法是3.0 Servlet规范的一部分,并且我的应用程序服务器(Tomcat 6)尚不支持此方法。即使具有

  • 我上传到S3使用以下代码: 我无法了解boto内部如何处理分段上传的任何信息。我对同样的事情有几个问题,让我们假设我有2.5 MB的文件: 然后文件将分3部分上传,如1,1和.5 MB? 所有3个部分将并行上传还是按顺序上传? 在java的aws库中,我们有转移管理器,在博托中有什么类似的东西吗? 此代码是否足以用于多段上传?因为我遇到了一些复杂的代码示例 任何帮助都将不胜感激。

  • 您好,我正在独立应用程序上使用java中的vertx读取web应用程序中的端口。我想从表单中获取post数据。我的web应用程序有一个带有post方法的表单,我希望阅读该表单。我的逻辑是 > 创建垂直线 创建http服务器 创建处理程序请求(它不接受代码中的所有参数) 我不知道我错过了什么,我是vertx的新手。 出于某种原因,我不能在这里发布代码。 我的代码:https://pastebin.c

  • 我正在使用vapor为我的应用程序托管图像。我有以下代码来接收图像并打印它。 我怎么能发送一个多部分的请求,只是使用swft?。这是我正在使用的当前帖子请求代码。