多部分数据未将所有参数传递给服务器-Swift 3

Posted

技术标签:

【中文标题】多部分数据未将所有参数传递给服务器-Swift 3【英文标题】:Multipartform data not passing in all params to server-Swift 3 【发布时间】:2017-04-12 12:14:29 【问题描述】:

我的要求是使用 REST API 将带有文件名和持续时间的录制音频文件上传到服务器

我必须形成多部分表单数据的代码如下

private func createRequestBody(boundary:"--BXDFG", multidata:Data, mime:"audio/mp4", filePathKey:"file", filename:"test", metas:["title":"Mytitle","duration":"30"] -> Data 

        var body = Data()

        body.append(Data("--\(boundary)\r\n".utf8))
        body.append(Data("Content-Disposition: form-data; name=\"\(filePathKey)\"; filename=\"\(filename)\"\r\n".utf8))
        body.append(Data("Content-Type: \(mime)\r\n\r\n".utf8))
        body.append(multidata)
        body.append(Data("\r\n".utf8))
        if (metas != nil) 

            for (key, value) in metas! 

                body.append(Data("--\(boundary)\r\n".utf8))
                body.append(Data("Content-Disposition: form-data; name=\"\(key)\"\r\n".utf8))
                body.append(Data((value as! String).utf8))
                body.append(Data("\r\n".utf8))
            

        
        body.append(Data("--\(boundary)--\r\n".utf8))

        return body

    

我正在做的是将音频作为 NSDATA 传递,并在 for 循环中将“标题”和“持续时间”添加到多部分表单请求中

在服务器端,我有以下代码

@api.route('/upload/<userid>', methods=['POST'])
def upload(userid):
    if request.method == 'POST':
        if 'title' not in request.form:
            return jsonify('error': 'Need a valid title for uploaded file', 'code': 403)

如果多部分表单数据中没有传入“title”,那么服务器会返回一个错误响应。

在我的情况下,即使“标题”作为请求的一部分添加,数据也不会传递到服务器并且服务器返回错误。如果我只是单独传递音频数据,去掉服务器端对“title”的验证,那么音频数据就会成功上传到服务器。

我不明白为什么“标题”和“数据”没有传递到服务器

PS:API 请求在 POSTMAN 客户端中运行良好。

谢谢

【问题讨论】:

我不知道为什么会这样,但是我可以建议你使用 alamofire 来处理这种情况,它简单流畅,检查它:github.com/Alamofire/Alamofire 【参考方案1】:

这解决了我的问题

换行

 body.append(Data("Content-Disposition: form-data; name=\"\(key)\"\r\n".utf8))

 body.append(Data("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".utf8))

添加和附加 /r/n

【讨论】:

您的意思是在为图像部分附加额外的 \r\n 后,您发布的代码运行良好?

以上是关于多部分数据未将所有参数传递给服务器-Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

URL 未将参数传递给 s-s-rS 报告

将自定义参数传递给 uibutton #selector swift 3

如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?

如何将参数传递给 Microsoft Sync 2.1 生成的存储过程

如何从反应原生桥将参数传递给swift类

在 Swift 中将参数传递给选择器