使用多行 Swift 字符串构建多部分表单数据不起作用
Building multipart form data with multiline Swift strings does not work
我有一个将多部分表单数据构建到 Swift String
中的函数,将该字符串转换为 Data
,然后将该数据分配给我的变量 URLRequest
' s httpBody
属性。当写成多行字符串时(内容是来自 UIImageJPEGRepresentation
的 JPEG UIImage
数据):
let body = """
--\(formDataBoundary)
Content-Disposition:form-data; name="file"; filename="image.jpeg"
Content-Type: image/jpeg
\(jpegData.base64EncodedString())
--\(formDataBoundary)--
"""
它不起作用,但通过多次追加组装而成:
var body = "--\(formDataBoundary)\r\n"
body += "Content-Disposition:form-data; name=\"file\"; filename=\"image.jpeg\"\r\n"
body += "Content-Type: image/jpeg\r\n\r\n"
body += "\(jpegData.base64EncodedString())\r\n\r\n"
body += "--\(formDataBoundary)--"
确实如此。有没有人解释为什么?我只对这两个实现进行评论,这就是我 URLSessionDataTask
的成功或失败之间产生差异的原因。
HTTP 和 MIME header 行由 CRLF 对终止(回车符 return + 换行符,\r\n
),这就是您在
中使用的内容
var body = "--\(formDataBoundary)\r\n"
// ...
Multi-line 字符串文字仅由换行符分隔,
您必须添加所需的 CR 字符:
let body = """
--\(formDataBoundary)\r
Content-Disposition:form-data; name="file"; filename="image.jpeg"\r
Content-Type: image/jpeg\r
\r
\(jpegData.base64EncodedString())\r
\r
--\(formDataBoundary)--\r
"""
我有一个将多部分表单数据构建到 Swift String
中的函数,将该字符串转换为 Data
,然后将该数据分配给我的变量 URLRequest
' s httpBody
属性。当写成多行字符串时(内容是来自 UIImageJPEGRepresentation
的 JPEG UIImage
数据):
let body = """
--\(formDataBoundary)
Content-Disposition:form-data; name="file"; filename="image.jpeg"
Content-Type: image/jpeg
\(jpegData.base64EncodedString())
--\(formDataBoundary)--
"""
它不起作用,但通过多次追加组装而成:
var body = "--\(formDataBoundary)\r\n"
body += "Content-Disposition:form-data; name=\"file\"; filename=\"image.jpeg\"\r\n"
body += "Content-Type: image/jpeg\r\n\r\n"
body += "\(jpegData.base64EncodedString())\r\n\r\n"
body += "--\(formDataBoundary)--"
确实如此。有没有人解释为什么?我只对这两个实现进行评论,这就是我 URLSessionDataTask
的成功或失败之间产生差异的原因。
HTTP 和 MIME header 行由 CRLF 对终止(回车符 return + 换行符,\r\n
),这就是您在
var body = "--\(formDataBoundary)\r\n"
// ...
Multi-line 字符串文字仅由换行符分隔, 您必须添加所需的 CR 字符:
let body = """
--\(formDataBoundary)\r
Content-Disposition:form-data; name="file"; filename="image.jpeg"\r
Content-Type: image/jpeg\r
\r
\(jpegData.base64EncodedString())\r
\r
--\(formDataBoundary)--\r
"""