Конвертировать UIImage в многочастную форму в Swift 4 - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь преобразовать мое изображение в данные многоэлементной формы, но оно получит ошибку.

var request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"

var boundary = generateBoundaryString()
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

var body = NSMutableData()

if self.img.image != nil {
    var imageData = UIImagePNGRepresentation(self.img.image)

    if imageData != nil {
        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name=\"image\"; filename=\"image.png\"\r\n")
        body.appendString("Content-Type: image/png\r\n\r\n")
        body.appendData(imageData!)
        body.appendString("\r\n")
    }

}

body.appendString("--\(boundary)--\r\n")
request.setValue("\(body.length)", forHTTPHeaderField:"Content-Length")
request.HTTPBody = body

Пожалуйста, дайте мне знать, как конвертировать UIImage в данные многоэлементной формы и быстро загрузить его на сервер.

Ответы [ 4 ]

0 голосов
/ 07 декабря 2018

Я реализовал загрузку изображения, используя Multi-part в Swift 4:

Вот код.Пожалуйста, посмотрите

func uploadImageToServerFromApp(nameOfApi : NSString, parameters : NSString, uploadedImage : UIImage, withCurrentTask :RequestType, andDelegate :AnyObject)->Void {

if self.isConnectedToNetwork(){
    currentTask = withCurrentTask
    let myRequestUrl = NSString(format: "%@%@%@",GlobalConstants.KBaseURL,nameOfApi,parameters)
    let url = (myRequestUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed))!
    var request : NSMutableURLRequest = NSMutableURLRequest()
    request = URLRequest(url: URL(string:url as String)!) as! NSMutableURLRequest
    request.httpMethod = "POST"
    //define the multipart request type
    request.setValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
    let image_data = UIImagePNGRepresentation(uploadedImage)
    if(image_data == nil){
        return
    }
    let body = NSMutableData()
    let fname = "image.png"
    let mimetype = "image/png"
    //define the data post parameter
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"image\"\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append("hi\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Disposition:form-data; name=\"image\"; filename=\"\(fname)\"\r\n".data(using: String.Encoding.utf8)!)
    body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
    body.append(image_data!)
    body.append("\r\n".data(using: String.Encoding.utf8)!)
    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
    request.httpBody = body as Data
    let session = URLSession.shared
    let task = session.dataTask(with: request as URLRequest) { (data, response, error) in
        guard let data = data, error == nil else {                                                 // check for fundamental networking error
            // print("error=\(String(describing: error))")
            self.showAlertMessage(title: "App name", message: "Server not responding, please try later")
            return
        }
        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            // print("statusCode should be 200, but is \(httpStatus.statusCode)")
            // print("response = \(String(describing: response))")
            self.delegate?.internetConnectionFailedIssue()
        }else{
            do {
                self.responseDictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! NSDictionary
                // self.Responsedata = data as NSData
                //self.responseDictionary = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: AnyObject] as NSDictionary;

                self.delegate?.responseReceived()
            } catch {
                //print("error serializing JSON: \(error)")
            }
        }
    }
    task.resume()
}else{
    // print("Internet Connection not Available!")
    self.showAlertMessage(title: "App Name", message: "No Internet Connection..")
}}                                                                                      
0 голосов
/ 07 декабря 2018

Попробуйте этот код, надеюсь, он вам поможет.

let url = "RequestURL"
let img = UIImage(contentsOfFile: fullPath)
let data: NSData = UIImageJPEGRepresentation(img, 1)

sendFile(url, 
    fileName:"one.jpg", 
    data:data, 
    completionHandler: completionHandler:{
        (result:Bool, isNoInternetConnection:Bool) -> Void in

            // ...     
            NSLog("Complete: \(result)")
    }
)


func sendFile(
    urlPath:String,
    fileName:String,
    data:NSData,
    completionHandler: (NSURLResponse!, NSData!, NSError!) -> Void){

        var url: NSURL = NSURL(string: urlPath)!
        var request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)

        request1.HTTPMethod = "POST"

        let boundary = generateBoundary()
        let fullData = photoDataToFormData(data,boundary:boundary,fileName:fileName)

        request1.setValue("multipart/form-data; boundary=" + boundary,
            forHTTPHeaderField: "Content-Type")

        // REQUIRED!
        request1.setValue(String(fullData.length), forHTTPHeaderField: "Content-Length")

        request1.HTTPBody = fullData
        request1.HTTPShouldHandleCookies = false

        let queue:NSOperationQueue = NSOperationQueue()

        NSURLConnection.sendAsynchronousRequest(
            request1,
            queue: queue,
            completionHandler:completionHandler)
}

// this is a very verbose version of that function
// you can shorten it, but i left it as-is for clarity
// and as an example
func photoDataToFormData(data:NSData,boundary:String,fileName:String) -> NSData {
    var fullData = NSMutableData()

    // 1 - Boundary should start with --
    let lineOne = "--" + boundary + "\r\n"
    fullData.appendData(lineOne.dataUsingEncoding(
        NSUTF8StringEncoding,
        allowLossyConversion: false)!)

    // 2
    let lineTwo = "Content-Disposition: form-data; name=\"image\"; filename=\"" + fileName + "\"\r\n"
    NSLog(lineTwo)
    fullData.appendData(lineTwo.dataUsingEncoding(
        NSUTF8StringEncoding,
        allowLossyConversion: false)!)

    // 3
    let lineThree = "Content-Type: image/jpg\r\n\r\n"
    fullData.appendData(lineThree.dataUsingEncoding(
        NSUTF8StringEncoding,
        allowLossyConversion: false)!)

    // 4
    fullData.appendData(data)

    // 5
    let lineFive = "\r\n"
    fullData.appendData(lineFive.dataUsingEncoding(
        NSUTF8StringEncoding,
        allowLossyConversion: false)!)

    // 6 - The end. Notice -- at the start and at the end
    let lineSix = "--" + boundary + "--\r\n"
    fullData.appendData(lineSix.dataUsingEncoding(
        NSUTF8StringEncoding,
        allowLossyConversion: false)!)

    return fullData
}
0 голосов
/ 07 декабря 2018

Попробуйте этот код

func requestWith(endUrl: String, imageData: Data?, parameters: [String : Any], onCompletion: ((JSON?) -> Void)? = nil, onError: ((Error?) -> Void)? = nil){

    let url = "http://google.com" /* your API url */

    let headers: HTTPHeaders = [
        /* "Authorization": "your_access_token",  in case you need authorization header */
        "Content-type": "multipart/form-data"
    ]

    Alamofire.upload(multipartFormData: { (multipartFormData) in
        for (key, value) in parameters {
            multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
        }

        if let data = imageData{
            multipartFormData.append(data, withName: "image", fileName: "image.png", mimeType: "image/png")
        }

    }, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
        switch result{
        case .success(let upload, _, _):
            upload.responseJSON { response in
                print("Succesfully uploaded")
                if let err = response.error{
                    onError?(err)
                    return
                }
                onCompletion?(nil)
            }
        case .failure(let error):
            print("Error in upload: \(error.localizedDescription)")
            onError?(error)
        }
    }
}
0 голосов
/ 07 декабря 2018

Попробуйте следующий код:

  func requestAPIWithImage( parameters:  Parameters,url: URLConvertible,Completion: @escaping (_ success: Bool,_ response: AnyObject) -> Void) {
    Alamofire.upload(multipartFormData: { (multipartFormData) in
        print(parameters)
        if Array(parameters.keys).contains(Keys.Image) {
        multipartFormData.append(UIImageJPEGRepresentation((parameters)[Keys.Image] as! UIImage, 1)!, withName: "image", fileName: "swift_file.jpeg", mimeType: "image/jpeg")
        }
        for (key, value) in parameters {
            print(key,value)
            if key != Keys.Image{
            multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
            }
        }
    }, to:url)
    { (result) in
        switch result {
        case .success(let upload, _, _):
            upload.uploadProgress(closure: { (progress) in
            })
            upload.responseJSON { response in
                print(response.result)
                self.getValidDict(result: response.result, completion: { (dict, error) in
               var dict = dict
               if dict == nil {
                dict = NSDictionary.init(dictionary:
                            [kBaseMessageKey: error?.localizedDescription ?? "Some error has been occured",
                             kBaseStatusKey: false])
                    }
    Completion(true,dict![Keys.result]! as AnyObject)
                })
           }
        case .failure(let encodingError):
            Completion(false,encodingError.localizedDescription as AnyObject)
            break
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...