首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS POST 上傳檔案含帳號密碼驗證:multipart/form-data 請求封裝與 AFNetworking/Alamofire 實作

     編輯:程式設計綜合問答

表單結構對應


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--

原生 URLSession 實作(Swift)


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()
}

Alamofire 簡化版


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 簡化邊界處理與錯誤重試。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved