用swiftui上传form-data并表示后端

发布于 2025-02-13 00:44:43 字数 3016 浏览 0 评论 0原文

我想上传一些以注册新用户的用户数据,我想上传配置文件图片。我尝试使用此代码,但它不起作用,在我的后端,我只是收到一个没有内部表单数据的请求。

这是我的迅速代码,

func UserRegisterRequest(firstname: String, lastname: String, username: String, email: String, password: String, image: UIImage , completionHandler: @escaping (ReturnMessage) -> Void) {
    
    let parameters = ["name": "MyTestFile123321",
                      "id": "12345"]
    
    // MARK: URL Components
    var components = URLComponents()
    components.scheme = "https"
    components.host = "my-url"
    components.path = "/register"
    
    
    //MARK: Create URL
    guard let url = components.url else {
        print("Invalid URL")
        return
    }
    
    guard let mediaImage = Media(withImage: image, forKey: "profilePicture") else { return }
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    
    //create boundary
    let boundary = generateBoundary()
    
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    //call createDataBody method
    let dataBody = createDataBody(withParameters: parameters, media: [mediaImage], boundary: boundary)
    
    request.httpBody = dataBody as Data
    
    print(request.httpBody)
    
    URLSession.shared.dataTask(with: request) {
        data, response, error in
        if let data = data {
            do {
                
                let decoder = JSONDecoder()
                
                
                decoder.dateDecodingStrategy = .formatted(DateFormatter.customFormatter)
                
                let response = try decoder.decode(ReturnMessage.self, from: data)
                
                completionHandler(response)
                
            }catch(let error) {
                print(error.localizedDescription)
            }
        } else {
            print("No Data")
        }
    }.resume()
}

func generateBoundary() -> String {
    return "Boundary-\(NSUUID().uuidString)"
}

func createDataBody(withParameters params: Parameters?, media: [Media]?, boundary: String) -> Data {
    
    let lineBreak = "\r\n"
    var body = Data()
    
    if let parameters = params {
        for (key, value) in parameters {
            body.append("--\(boundary + lineBreak)")
            body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
            body.append("\(value + lineBreak)")
        }
    }
    
    if let media = media {
        for photo in media {
            print(photo)
            body.append("--\(boundary + lineBreak)")
            body.append("Content-Disposition: form-data; name=\"\(photo.key)\"; filename=\"\(photo.filename)\"\(lineBreak)")
            body.append("Content-Type: \(photo.mimeType + lineBreak + lineBreak)")
            body.append(photo.data)
            body.append(lineBreak)
        }
    }
            
    body.append("--\(boundary)--\(lineBreak)")
    
    return body
}

我不知道这是否是正确的方法,但欢迎任何帮助。

谢谢你帮助我

I want to upload some user data for register new users and I want to upload a profile picture. I'v tried with this code but it doesn't work, on my backend im just receiving a request with nothing like a form-data inside.

This is my swift code

func UserRegisterRequest(firstname: String, lastname: String, username: String, email: String, password: String, image: UIImage , completionHandler: @escaping (ReturnMessage) -> Void) {
    
    let parameters = ["name": "MyTestFile123321",
                      "id": "12345"]
    
    // MARK: URL Components
    var components = URLComponents()
    components.scheme = "https"
    components.host = "my-url"
    components.path = "/register"
    
    
    //MARK: Create URL
    guard let url = components.url else {
        print("Invalid URL")
        return
    }
    
    guard let mediaImage = Media(withImage: image, forKey: "profilePicture") else { return }
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    
    //create boundary
    let boundary = generateBoundary()
    
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    //call createDataBody method
    let dataBody = createDataBody(withParameters: parameters, media: [mediaImage], boundary: boundary)
    
    request.httpBody = dataBody as Data
    
    print(request.httpBody)
    
    URLSession.shared.dataTask(with: request) {
        data, response, error in
        if let data = data {
            do {
                
                let decoder = JSONDecoder()
                
                
                decoder.dateDecodingStrategy = .formatted(DateFormatter.customFormatter)
                
                let response = try decoder.decode(ReturnMessage.self, from: data)
                
                completionHandler(response)
                
            }catch(let error) {
                print(error.localizedDescription)
            }
        } else {
            print("No Data")
        }
    }.resume()
}

func generateBoundary() -> String {
    return "Boundary-\(NSUUID().uuidString)"
}

func createDataBody(withParameters params: Parameters?, media: [Media]?, boundary: String) -> Data {
    
    let lineBreak = "\r\n"
    var body = Data()
    
    if let parameters = params {
        for (key, value) in parameters {
            body.append("--\(boundary + lineBreak)")
            body.append("Content-Disposition: form-data; name=\"\(key)\"\(lineBreak + lineBreak)")
            body.append("\(value + lineBreak)")
        }
    }
    
    if let media = media {
        for photo in media {
            print(photo)
            body.append("--\(boundary + lineBreak)")
            body.append("Content-Disposition: form-data; name=\"\(photo.key)\"; filename=\"\(photo.filename)\"\(lineBreak)")
            body.append("Content-Type: \(photo.mimeType + lineBreak + lineBreak)")
            body.append(photo.data)
            body.append(lineBreak)
        }
    }
            
    body.append("--\(boundary)--\(lineBreak)")
    
    return body
}

I don't know if this is the right way to do it but any help is welcome.

thanks for you helping me guys

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文