如何使用Swift在iOS中将图像上传到服务器?

32

无法正常工作,如何将图像从iOS Swift应用程序发送到我的PHP服务器?

@IBAction func upload(sender: UIButton) {

    var imageData = UIImageJPEGRepresentation(img.image, 90)
   // println(imageData)
    let url = NSURL(string:"http://www.i35.club.tw/old_tree/test/uplo.php")
    //let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    //var request = NSMutableURLRequest(URL: url, cachePolicy: cachePolicy, timeoutInterval: 10)
    var request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"

    // set Content-Type in HTTP header
    let boundaryConstant = "----------V2ymHFg03esomerandomstuffhbqgZCaKO6jy";
    let contentType = "multipart/form-data; boundary=" + boundaryConstant
    NSURLProtocol.setProperty(contentType, forKey: "Content-Type", inRequest: request)
    request.HTTPBody = imageData
    // set data
    //var dataString = "adkjlkajfdadf"
    //let requestBodyData = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
    //request.HTTPBody = requestBodyData


    //

    request.addValue(contentType, forHTTPHeaderField: "Content-Type")
    request.addValue("multipart/form-data", forHTTPHeaderField: "Accept")
    //
    // set content length

    //NSURLProtocol.setProperty(requestBodyData.length, forKey: "Content-Length", inRequest: request)

    var response: NSURLResponse? = nil
    var error: NSError? = nil
    let reply = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&error)

    let results = NSString(data:reply!, encoding:NSUTF8StringEncoding)
    println("API Response: \(results)")
}

//take photo
func imagePickerController(picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {


    var selectedImage : UIImage = image
     img.image = selectedImage
    UIImageWriteToSavedPhotosAlbum(selectedImage, nil, nil, nil)
    self.dismissViewControllerAnimated(true, completion: nil)

}
11个回答

29

我已按用户选择拍摄了照片并编写了适用于Swift 2和iOS9的代码。

    func imageUploadRequest(imageView imageView: UIImageView, uploadUrl: NSURL, param: [String:String]?) {

        //let myUrl = NSURL(string: "http://192.168.1.103/upload.photo/index.php");

        let request = NSMutableURLRequest(URL:uploadUrl);
        request.HTTPMethod = "POST"

        let boundary = generateBoundaryString()

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

        let imageData = UIImageJPEGRepresentation(imageView.image!, 1)

        if(imageData==nil)  { return; }

        request.HTTPBody = createBodyWithParameters(param, filePathKey: "file", imageDataKey: imageData!, boundary: boundary)

        //myActivityIndicator.startAnimating();

        let task =  NSURLSession.sharedSession().dataTaskWithRequest(request,
            completionHandler: {
                (data, response, error) -> Void in
                if let data = data {

                    // You can print out response object
                    print("******* response = \(response)")

                    print(data.length)
                    // you can use data here

                    // Print out reponse body
                    let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
                    print("****** response data = \(responseString!)")

                    let json =  try!NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as? NSDictionary

                    print("json value \(json)")

                    //var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers, error: &err)

                    dispatch_async(dispatch_get_main_queue(),{
                        //self.myActivityIndicator.stopAnimating()
                        //self.imageView.image = nil;
                    });

                } else if let error = error {
                    print(error.description)
                }
        })
        task.resume()


    }


    func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
        let body = NSMutableData();

        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString("--\(boundary)\r\n")
                body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString("\(value)\r\n")
            }
        }

        let filename = "user-profile.jpg"

        let mimetype = "image/jpg"

        body.appendString("--\(boundary)\r\n")
        body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
        body.appendString("Content-Type: \(mimetype)\r\n\r\n")
        body.appendData(imageDataKey)
        body.appendString("\r\n")

        body.appendString("--\(boundary)--\r\n")

        return body
    }

    func generateBoundaryString() -> String {
        return "Boundary-\(NSUUID().UUIDString)"
    }

}// extension for impage uploading

extension NSMutableData {

    func appendString(string: String) {
        let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
        appendData(data!)
    }
}

--------- 以下是 PHP 端的代码

<?php

$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];
$userId = $_POST["userId"];

$target_dir = "media";

if(!file_exists($target_dir))
{
mkdir($target_dir, 0777, true);
}

$target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]);

if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)) 
{
echo json_encode([
"Message" => "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.",
"Status" => "OK",
"userId" => $_REQUEST["userId"]
]);

} else {

echo json_encode([
"Message" => "Sorry, there was an error uploading your file.",
"Status" => "Error",
"userId" => $_REQUEST["userId"]
]);

}

我已经为此苦苦挣扎了好几天。刚刚看到你的代码,它完美地运行了。谢谢! - Martin Muldoon
@VinodJoshi,你能为Node.js和Express后端做同样的事情吗? - Deepak Kumar Sahu

11

使用以下代码上传带有参数的图像:

 // Your method to upload image with parameters to server.     

func uploadImageOne(){
    var imageData = UIImagePNGRepresentation(imageView.image)

    if imageData != nil{
        var request = NSMutableURLRequest(URL: NSURL(string:"Enter Your URL")!)
        var session = NSURLSession.sharedSession()

        request.HTTPMethod = "POST"

        var boundary = NSString(format: "---------------------------14737809831466499882746641449")
        var contentType = NSString(format: "multipart/form-data; boundary=%@",boundary)
      //  println("Content Type \(contentType)")
        request.addValue(contentType, forHTTPHeaderField: "Content-Type")

        var body = NSMutableData.alloc()

        // Title
         body.appendData(NSString(format: "\r\n--%@\r\n",boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format:"Content-Disposition: form-data; name=\"title\"\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)

        // Image
        body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format:"Content-Disposition: form-data; name=\"profile_img\"; filename=\"img.jpg\"\\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format: "Content-Type: application/octet-stream\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(imageData)
        body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)



        request.HTTPBody = body


        var returnData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)

        var returnString = NSString(data: returnData!, encoding: NSUTF8StringEncoding)

        println("returnString \(returnString)")

    }


}

无论我尝试查看哪张图片,都会显示为损坏的文件。 - inVINCEable
@inVINCEable,我已经使用上述代码完成了这个任务。请检查您的PHP服务,图片是多类型和八进制流。 - Programming Learner
1
我的 PHP 服务很好,最终我切换到 SRWebClient,它完美地工作了。 - inVINCEable
@inVINCEable 很高兴你的任务已经完成。感谢你告诉我SRWebClient。 - Programming Learner
1
不要使用NSURLConnection.sendSynchronousRequest,请改用NSURLSession,并避免发送同步网络请求! - ecnepsnai

8

我更新了适用于 Swift 3 的代码

func uploadImage() {
    let url = URL(string: "YOUR SERVER URL");
    let request = NSMutableURLRequest(url: url!);
    request.httpMethod = "POST"
    let boundary = "Boundary-\(NSUUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    var retreivedImage: UIImage? = nil
    //Get image
    do {
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
        let readData = try Data(contentsOf: URL(string: "file://\(documentsPath)/myImage")!)
        retreivedImage = UIImage(data: readData)
        addProfilePicView.setImage(retreivedImage, for: .normal)
    }
    catch {
        print("Error while opening image")
        return
    }

    let imageData = UIImageJPEGRepresentation(retreivedImage!, 1)
    if (imageData == nil) {
        print("UIImageJPEGRepresentation return nil")
        return
    }

    let body = NSMutableData()
    body.append(NSString(format: "\r\n--%@\r\n", boundary).data(using: String.Encoding.utf8.rawValue)!)
    body.append(NSString(format: "Content-Disposition: form-data; name=\"api_token\"\r\n\r\n" as NSString).data(using: String.Encoding.utf8.rawValue)!)
    body.append(NSString(format: (UserDefaults.standard.string(forKey: "api_token")! as NSString)).data(using: String.Encoding.utf8.rawValue)!)
    body.append(NSString(format: "\r\n--%@\r\n", boundary).data(using: String.Encoding.utf8.rawValue)!)
    body.append(NSString(format:"Content-Disposition: form-data; name=\"profile_img\"; filename=\"testfromios.jpg\"\r\n").data(using: String.Encoding.utf8.rawValue)!)
    body.append(NSString(format: "Content-Type: application/octet-stream\r\n\r\n").data(using: String.Encoding.utf8.rawValue)!)
    body.append(imageData!)
    body.append(NSString(format: "\r\n--%@\r\n", boundary).data(using: String.Encoding.utf8.rawValue)!)

    request.httpBody = body as Data

    let task =  URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
        (data, response, error) -> Void in
        if let data = data {
           // do what you want in success case   
        } else if let error = error {
            print(error.localizedDescription)
        }
    })

    task.resume()
}

你可以从@VinodJoshi的回答中获取PHP端代码。


4
根据Sergey Kargopolov的博客文章(http://swiftdeveloperblog.com/image-upload-example/)和他的视频(https://youtu.be/HqxeyS961Uk),这是在Swift 5中完美运行的代码。它将上传照片到php脚本中指定的目录,并根据提供的imgKey命名图片。在我的示例中,它将把imageToUpload从myImageUploadRequest上传到目录"wp-content/Images"中。param字典不一定需要。这可能可以更有效地编写,但也许对于某些人来说这是个开始 :)
func myImageUploadRequest(imageToUpload: UIImage, imgKey: String) {

    let myUrl = NSURL(string: "https://yourdomain/uploadPicture.php");
    let request = NSMutableURLRequest(url:myUrl! as URL);
    request.httpMethod = "POST";

    let param = [
        "firstName"  : "name",
        "lastName"    : "name",
        "userId"    : "42"
    ]

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

    let imageData = imageToUpload.jpegData(compressionQuality: 1)
    if imageData == nil  {
        return
    }

    request.httpBody = createBodyWithParameters(parameters: param, filePathKey: "file", imageDataKey: imageData! as NSData, boundary: boundary, imgKey: imgKey) as Data

    let task = URLSession.shared.dataTask(with: request as URLRequest) {
        data, response, error in

            if error != nil {
                print("error=\(error!)")
                return
            }

            //print response
            //print("response = \(response!)")

            // print reponse body
            let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
            print("response data = \(responseString!)")

        }

        task.resume()
    }




func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String, imgKey: String) -> NSData {
        let body = NSMutableData();

        if parameters != nil {
            for (key, value) in parameters! {
                body.appendString(string: "--\(boundary)\r\n")
                body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
                body.appendString(string: "\(value)\r\n")
            }
        }

        let filename = "\(imgKey).jpg"
        let mimetype = "image/jpg"

        body.appendString(string: "--\(boundary)\r\n")
        body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
        body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n")
        body.append(imageDataKey as Data)
        body.appendString(string: "\r\n")
        body.appendString(string: "--\(boundary)--\r\n")

        return body
    }

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

}

extension NSMutableData {
    func appendString(string: String) {
        let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
        append(data!)
    }
}

服务器端的php(PHP/7.3.18)代码:

<?php

$firstName = $_POST["firstName"];
$lastName = $_POST["lastName"];
$userId = $_POST["userId"];

$target_dir = "wp-content/Images";

if (!file_exists($target_dir)) {
    mkdir($target_dir, 0777, true);
}

$target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]);

if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)) {

    echo json_encode([
    "Message" => "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.",
    "Status" => "OK",
    "userId" => $_REQUEST["userId"]
    ]);

} 
else {

    echo json_encode([
    "Message" => "Sorry, there was an error uploading your file.",
    "Status" => "Error",
    "userId" => $_REQUEST["userId"]
    ]);

}

?>

示例控制台输出:

response data = {
"Message":"The file 9B862D73-9F0B-4DD3-8FBB-452AEF2FE1CF.jpg has been uploaded.",
"Status":"OK",
"userId":"17"}

1
你绝对不应该使用“NSUrl”……或者任何“NS-”相关的东西。特别是如果你在使用Swift 5。你可以直接使用“URL(string: link)”来代替。你提供的指南是2015年的,所以已经非常过时了。 - mystic cola
这是一个被低估的注释。 - FontFamily

3
我已经编写了一个块方法的函数,它易于使用,并且是一个类函数,因此您可以在项目中任何地方使用它,例如:
MVCServer.swift  

NSObject class and

import Alamofire 

然后在这个类中编写此函数。
 func postImageRequestWithURL(withUrl strURL: String,withParam postParam: Dictionary<String, Any>,withImages imageArray:NSMutableArray,completion:@escaping (_ isSuccess: Bool, _ response:NSDictionary) -> Void)
{

    Alamofire.upload(multipartFormData: { (MultipartFormData) in

        // Here is your Image Array
        for (imageDic) in imageArray
        {
            let imageDic = imageDic as! NSDictionary

            for (key,valus) in imageDic
            {
                MultipartFormData.append(valus as! Data, withName:key as! String,fileName: "file.jpg", mimeType: "image/jpg")
            }
        }

        // Here is your Post paramaters
        for (key, value) in postParam
        {
            MultipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
        }

    }, usingThreshold: UInt64.init(), to: strURL, method: .post) { (result) in

        switch result {
        case .success(let upload, _, _):

            upload.uploadProgress(closure: { (progress) in
                print("Upload Progress: \(progress.fractionCompleted)")
            })

            upload.responseJSON { response in

                if response.response?.statusCode == 200
                {
                    let json = response.result.value as? NSDictionary

                    completion(true,json!);
                }
                else
                {
                    completion(false,[:]);
                }
            }

        case .failure(let encodingError):
            print(encodingError)

            completion(false,[:]);
        }

    }
}

现在调用这个函数。
var ImageArray : NSMutableArray!

// Here is your post parameter 
var parameters: [String:Any] = ["user_master_id" : “56”,
                                        "first_name": “Jignesh”,
                                        "last_name" : “Mayani”,
                                        "email": “TestEmail@gmail.com”]
// Here is your image is in DATA formate don’t send as UIImage formate       
let ImageDic = ["profile_image" : imageData!]

// Here you can pass multiple image in array i am passing just one 
ImageArray = NSMutableArray(array: [ImageDic as NSDictionary])

MVCServer().postImageRequestWithURL(withUrl: "write Your URL here", withParam: parameters, withImages: ImageArray) { (isSuccess, response) in
      // Your Will Get Response here   
    }

1
我建议看一下:https://github.com/sraj/Swift-SRWebClient 这是我使用的样例函数:
func uploadImage(image:UIImage) {
  let imageData:NSData = UIImageJPEGRepresentation(image, 100)
  SRWebClient.POST("http://www.example.com/upload/")
    .data(imageData, fieldName:"photo", data: ["foo":"bar","baz":"qux"])
    .send({(response:AnyObject!, status:Int) -> Void in
        // process success response
    },failure:{(error:NSError!) -> Void in
        // process failure response
    })
}

你会注意到上面的代码是Swift-SRWebClient Github页面片段的略微调整版本。我用UIImageJPEGRepresentation替换了NSData.dataWithData,因为前者已经过时。
此外,不要忘记将SRWebClient.swift拖入您的项目文件夹,否则这将无法工作 :)

@VincentvanLeeuwen,这对我不起作用...我该如何发送参数?我将它们包含在数据中,但它不起作用。 - Tyler
抱歉回复晚了。这是我所做的更详细版本:http://blog.vincentleeuwen.com/uploading-an-image-with-swift-and-django-rest-api-framework - Vincent van Leeuwen
1
@bashan 在 Swift 2 中已经解决了。请查看我的分支:https://github.com/sshadmand/Swift-SRWebClient - Sean

1
@IBAction func upload(sender: UIButton) {
    var imageData = UIImageJPEGRepresentation(img.image, 90)
    var url = NSURL(string: "http://www.i35.club.tw/old_tree/test/uplo.php")
    var request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.HTTPBody = NSData.dataWithData(UIImagePNGRepresentation(imageData))
        
    var response: NSURLResponse? = nil
    var error: NSError? = nil
    let reply = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)

    let results = NSString(data: reply!, encoding: NSUTF8StringEncoding)
    println("API Response: \(results)")
}       

请参考这个链接:link

如果有多个参数需要发送,该如何完成上传图像的操作?http://stackoverflow.com/questions/30006290/uploading-image-in-swift-with-multiple-parameters - Tyler

0

太好了,我一直尝试使用REST传递图像,但无法正确格式化并不断出现超时错误。使用createBodyWithParameters方法,我终于让它正常工作了。

这是Swift 3版本的代码:

func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: UIImage, boundary: String) -> Data {
  var body = Data();

  if parameters != nil {
     for (key, value) in parameters! {
        body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
        body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
        body.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
     }
  }

  let filename = "user-profile.jpg"

  let mimetype = "image/jpg"

  body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
  body.append("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n".data(using: String.Encoding.utf8)!)
  body.append("Content-Type: \(mimetype)\r\n\r\n".data(using: String.Encoding.utf8)!)
  body.append(UIImageJPEGRepresentation(imageDataKey, 1)!)
  //body.appendData(imageDataKey)
  body.append("\r\n".data(using: String.Encoding.utf8)!)

  body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)

  return body
}

0

仅看这个简单的解释:

使用URLRequest处理表单数据和多部分上传

此外,为了保持代码更新,您可以将NSMutableData替换为Data。因此,您的最终代码将如下所示:

func createHttpBody(parameters: [String: String]? = nil, _ boundary: String, data: Data, mimeType: String, filename: String) -> Data {
    var body = Data()

    let boundaryPrefix = "--\(boundary)\r\n"

    if let parameters = parameters {

        for (key, value) in parameters {
            body.append(boundaryPrefix)
            body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.append("\(value)\r\n")
        }
    }

    body.append(boundaryPrefix)
    body.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(filename)\"\r\n")
    body.append("Content-Type: \(mimeType)\r\n\r\n")
    body.append(data)
    body.append("\r\n")
    body.append("--".appending(boundary.appending("--")))

    return body
}

更新了 Data 扩展,使用 append 方法:

extension Data {

    mutating func append(_ string: String) {

        if let data = string.data(using: .utf8) {
            append(data)
        }
    }
}

你也可以查看这个视频教程,并检查该教程的源代码


-2
在Swift 4.1和Xcode 9.4.1中,
请查看我的博客中的代码,以上传图像至服务器(用Swift实现)。

https://markingios.blogspot.com/2018/09/upload-image-to-server-in-swift.html

调用此函数的方式为:uploadImage()

func uploadImage(){

let imageData = UIImageJPEGRepresentation(yourImage!, 1.0)//Replace your image

if imageData != nil{
   var request = URLRequest(url: NSURL(string:urlString)! as URL)//Send your URL here
   print(request)

   request.httpMethod = "POST"

   let boundary = NSString(format: "---------------------------14737809831466499882746641449")
   let contentType = NSString(format: "multipart/form-data; boundary=%@",boundary)
   //  println("Content Type \(contentType)")
   request.addValue(contentType as String, forHTTPHeaderField: "Content-Type")

   var body = Data()

   body.append(NSString(format: "\r\n--%@\r\n", boundary).data(using: String.Encoding.utf8.rawValue)!)
   body.append(NSString(format:"Content-Disposition: form-data;name=\"title\"\r\n\r\n").data
                        (using:String.Encoding.utf8.rawValue)!)
   body.append("Hello".data(using: String.Encoding.utf8, allowLossyConversion: true)!)


   body.append(NSString(format: "\r\n--%@\r\n", boundary).data(using: String.Encoding.utf8.rawValue)!)
   body.append(NSString(format:"Content-Disposition: form-data;name=\"uploaded_file\";filename=\"image.jpg\"\\r\n").data
                       (using:String.Encoding.utf8.rawValue)!) //Here replace your image name and file name
   body.append(NSString(format: "Content-Type: image/jpeg\r\n\r\n").data(using: String.Encoding.utf8.rawValue)!)
   body.append(imageData!)
   body.append(NSString(format: "\r\n--%@\r\n", boundary).data(using: String.Encoding.utf8.rawValue)!)

   request.httpBody = body

   let task = URLSession.shared.dataTask(with: request) { data, response, error in guard let data = data, error == nil      
       else { // check for fundamental networking error
       print("error=\(String(describing: error))")
       SharedClass.sharedInstance.alert(view: self, message: "\(String(describing: error!.localizedDescription))")
       return
    }

    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode == 500 {
        SharedClass.sharedInstance.alert(view: self, message: "Server Error")
    } else 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))")
    }

    //This can print your response in string formate        
    let responseString = String(data: data, encoding: .utf8)
     //            let dictionary = data
     //            print("dictionary = \(dictionary)")
     print("responseString = \(String(describing: responseString!))")

     do {
         self.response3 = (try JSONSerialization.jsonObject(with: data, options: []) as? [String: AnyObject])!
         print(self.response3)

         if (((self.response3["Response"] as? [String : Any])?["status"]) as! String == "SUCCESS") {
               let message = (self.response3["Response"] as? [String : Any])?["message"] as? String
                   SharedClass.sharedInstance.alert(view:self, message: message)
          } else {
                let message = (self.response3["Response"] as? [String : Any])?["message"] as? String
                    SharedClass.sharedInstance.alert(view:self, message: message)
                }

      } catch let error as NSError {
           print(error)
           print(error.localizedDescription)
      }
   }

    task.resume()

 }


}

不要为“boundary”指定硬编码值。使用动态生成的值,如“NSUUID().uuidString”。 - Raptor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接