POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----BOUNDARY
------BOUNDARY
Content-Disposition: form-data; name="FromUserName"
username
------BOUNDARY
Content-Disposition: form-data; name="password"
passwd
------BOUNDARY
Content-Disposition: form-data; name="uploadFile"; filename="data.bin"
Content-Type: application/octet-stream
------BOUNDARY--
func upload(fileURL: URL, username: String, password: String, completion: @escaping (Result) -> Void) {
var request = URLRequest(url: URL(string: "https://example.com/upload")!)
request.httpMethod = "POST"
let boundary = UUID().uuidString
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
var body = Data()
func appendField(_ name: String, _ value: String) {
body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"\(name)\"\r\n\r\n")
body.append("\(value)\r\n")
}
func appendFile(_ name: String, _ filename: String, _ data: Data, _ mime: String) {
body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"\(name)\"; filename=\"\(filename)\"\r\n")
body.append("Content-Type: \(mime)\r\n\r\n")
body.append(data)
body.append("\r\n")
}
appendField("FromUserName", username)
appendField("password", password)
appendFile("uploadFile", fileURL.lastPathComponent, try! Data(contentsOf: fileURL), "application/octet-stream")
body.append("--\(boundary)--\r\n")
request.httpBody = body
URLSession.shared.dataTask(with: request) { data, resp, err in
if let err = err { completion(.failure(err)) }
else { completion(.success(data ?? Data())) }
}.resume()
}
AF.upload(multipartFormData: { form in
form.append(username.data(using: .utf8)!, withName: "FromUserName")
form.append(password.data(using: .utf8)!, withName: "password")
form.append(fileURL, withName: "uploadFile")
}, to: "https://example.com/upload").response { resp in
// 處理回應
}
CSDN iOS multipart/form-data 上傳完整教學
iOS 上傳檔案含帳號密碼,構建 multipart/form-data 請求體,包含三個部分:FromUserName、password、uploadFile。推薦使用 Alamofire 簡化邊界處理與錯誤重試。