简体   繁体   中英

Multipart request with ios10

I'm working on multipart request with swift, iOS10.

Saved image to the server with code below. And just receive 404 error when open the image with url.

I can't find what's wrong in my code though referred to webpage - https://newfivefour.com/swift-form-data-multipart-upload-URLRequest.html

Please help.

func connectToServerWithImage(urlString: String, param: Any, image: UIImage, target: NSObject, action: Selector) {

    let url = URL(string: urlString)!
    var request = URLRequest(url: url)

    // set request configuration
    let boundary = "Boundary-\(UUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"

    // set body
    let body = NSMutableData()
    let paramDic = param as! Dictionary<String, String>

    // set param to body
    for (key, value) in paramDic {
        body.append("--\(boundary)\r\n".data(using: .utf8, allowLossyConversion: false)!)
        body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: .utf8)!)
        body.append("\(value)\r\n".data(using: .utf8)!)
    }

    // set image to body
    let filename = paramDic["\(paramDic["TYPE"]!)_MST_NO"]! + ".jpg"
    body.append("--\(boundary)\r\n".data(using: .utf8, allowLossyConversion: false)!)
    body.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(filename)\"\r\n\r\n".data(using: .utf8, allowLossyConversion: false)!)
    body.append("Content-Type: image/jpg\r\n\r\n".data(using: .utf8, allowLossyConversion: false)!)
    body.append(UIImageJPEGRepresentation(image, 1)!)
    body.append("\r\n".data(using: .utf8, allowLossyConversion: false)!)
    body.append("--\(boundary)--\r\n".data(using: .utf8, allowLossyConversion: false)!)

    request.httpBody = body as Data

    // url configuration
    let urlConfig = URLSessionConfiguration.ephemeral
    urlConfig.timeoutIntervalForRequest = 5
    urlConfig.timeoutIntervalForResource = 5

    let session = URLSession(configuration: urlConfig)

    let dataTask = session.dataTask(with: request) { (data, response, error) in
        session.finishTasksAndInvalidate()
        DispatchQueue.main.async {
            if error == nil {

                if let httpUrlResponse = response as? HTTPURLResponse {
                    if httpUrlResponse.statusCode == 200 {
                        do {
                            let jsonObject: Dictionary<String, Any> = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! Dictionary<String, Any>

                            if jsonObject.isEmpty {
                                target.perform(action, with: ["RES_CODE:": "NULL"])
                            }
                        } catch let _ {}
                    }
                }
            }
        }
    }
    dataTask.resume()
}

Sample Code for Multipart API in iOS 10:

func Api_MultiPart()
{       
    var url_request  = URLRequest(url: URL(string: EmployerRegApi())!)
    url_request.httpShouldHandleCookies = false
    url_request.timeoutInterval = 60
    url_request.httpMethod = "POST"

    let boundary = "-----------Sample------------"
    let form_data = "multipart/form-data; boundary=\(boundary)"
    url_request.setValue(form_data, forHTTPHeaderField: "Content-Type")

    let body = NSMutableData()

    /*----------------- Company -----------------*/
    body.appendString("--\(boundary)\r\n")
    body.appendString("Content-Disposition: form-data; name=\"\(str_company_name_key)\r\n\r\n")
    body.appendString("\(str_company_name_val)\r\n")

    /*--------------- Address ID ---------------*/
    body.appendString("--\(boundary)\r\n")
    body.appendString("Content-Disposition: form-data; name=\"\(str_address2_key)\r\n\r\n")
    body.appendString("\(str_address_val)\r\n")

    /*--------------- State Code ---------------*/
    body.appendString("--\(boundary)\r\n")
    body.appendString("Content-Disposition: form-data; name=\"\(str_country_key)\r\n\r\n")
    body.appendString("\(str_country_val)\r\n")

    /*------------- Profile Image --------------*/
    if (str_photo_val != nil)
    {
        body.appendString("--\(boundary)\r\n")
        let mimetype = "image/jpg"
        let defFileName = generate_Image_Name_Multipart() //yourImageName.jpg
        let imageData = UIImageJPEGRepresentation(str_photo_val!, 1)

        body.appendString("Content-Disposition: form-data; name=\"\(str_photo_key)\"; filename=\"\(defFileName)\"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.append(imageData!)
        body.appendString("\r\n")
    }
    body.appendString("--\(boundary)\r\n")

    url_request.httpBody = body as Data
    let postLength: String = "\(UInt(body.length))"
    url_request.setValue(postLength, forHTTPHeaderField: "Content-Length")

    let task = URLSession.shared.dataTask(with: url_request, completionHandler: { (data, response, error) in
        if error != nil{
            print("Error -> \(String(describing: error))")
            DispatchQueue.main.async {
                hideLoadingHUD(for_view: self.view)
            }
            return
        }
        do {
            let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject]
            print("Result -> \(String(describing: result))")
            DispatchQueue.main.async {
                hideLoadingHUD(for_view: self.view)
            }

        } catch {
            print("Error -> \(error)")
            DispatchQueue.main.async {
                hideLoadingHUD(for_view: self.view)
            }
        }
    })
    task.resume()
}


func generate_Image_Name_Multipart() -> String {
    let min: Int = 1
    let max: Int = 999
    let randNum: Int = (Int(arc4random_uniform(3)) % Int((max - min) + min))
    print("Random Number: \(randNum)")
    let dateformate = DateFormatter()
    dateformate.dateFormat = "ddMMyyyyHHmmss"
    let date: String = dateformate.string(from: Date())
    let img_name: String = "iOS_\(date)_\(randNum).jpg"
    return img_name
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM