简体   繁体   English

ios10的多部分请求

[英]Multipart request with ios10

I'm working on multipart request with swift, iOS10. 我正在使用iOS10快速进行多部分请求。

Saved image to the server with code below. 使用以下代码将图像保存到服务器。 And just receive 404 error when open the image with url. 当使用url打开图像时,只会收到404错误。

I can't find what's wrong in my code though referred to webpage - https://newfivefour.com/swift-form-data-multipart-upload-URLRequest.html 尽管参考了网页,但我找不到代码中的错误-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: iOS 10中Multipart API的示例代码:

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
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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