【问题标题】:How to upload images to a server in iOS with Swift?如何使用 Swift 将图像上传到 iOS 中的服务器?
【发布时间】:2014-12-07 18:17:33
【问题描述】:

它不起作用,如何将图像从 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)

}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    request.httpMethod = "POST"对于上传长字符串或blob很重要

    func imageUpload(imageData:String){       
     var request:NSMutableURLRequest!
            let param:String = "image=\(imageData)" // image data should be here
            request = NSMutableURLRequest(url: URL(string: "www.pickmyoffers.com")!)// use your upload php file link and parameter "example.com/upload.php?image=\(imageData)"
            
            request.httpMethod = "POST"
            
            request.httpBody = param.data(using: String.Encoding.utf8)
            let session = URLSession.shared
            let task = session.dataTask(with: request as URLRequest) {data,response,error in
                if error != nil {
                    print("error=\(error)")
                    return
                }
                let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
                print(responseString!)
            }
            task.resume()
    }
    

    【讨论】:

    • 你在哪里使用了“imageData”?为什么 param 是空字符串?
    【解决方案2】:

    根据 Sergey Kargopolov (http://swiftdeveloperblog.com/image-upload-example/) 的博文和他的视频 (https://youtu.be/HqxeyS961Uk),这是我在 Swift 5 中完美运行的代码。 它将图片上传到 php 脚本中指定的目录(进一步向下),并根据给出的 imgKey 命名图片。在我的示例中,它将 myImageUploadRequest 的 imageToUpload 上传到目录“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"}
    

    【讨论】:

    • 你绝对不应该使用“NSUrl”...或“NS-anything”。特别是如果您使用的是 Swift 5。您可以只使用“URL(字符串:链接)”。您链接到的 guie 是 2015 年的……所以它已经非常过时了。
    • 这是一条被低估的评论。
    【解决方案3】:

    看看这个简单的解释:

    Form data and multipart uploads with 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)
            }
        }
    }
    

    您也可以查看此video tutorial 并查看source code 以获取该教程。

    【讨论】:

      【解决方案4】:

      在 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
      【解决方案5】:

      我为 Block 方法制作了易于使用的函数,这是类函数,因此您可以在项目中的任何地方使用,例如 make

      MVCServer.swift  
      

      NSObject 类和

      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   
          }
      

      【讨论】:

        【解决方案6】:

        这太棒了,我一直在尝试使用 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
        }
        

        【讨论】:

          【解决方案7】:

          我为 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 端代码。

          【讨论】:

            【解决方案8】:

            我根据用户的选择拍照并为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"]
            ]);
            
            }
            

            【讨论】:

            • 我已经为此苦苦挣扎了好几天。刚刚遇到您的代码,它就像一个魅力。谢谢!!
            • @VinodJoshi 你能不能对 node js 做同样的事情并表达支持?
            【解决方案9】:

            我建议看看: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 页面上的 sn-ps 的略微调整版本。我已将 NSData.dataWithData 替换为 UIImageJPEGRepresentation,因为前者已被弃用。

            另外,不要忘记将SRWebClient.swift 拖到您的项目文件夹中,否则这将不起作用:)

            【讨论】:

            【解决方案10】:

            要上传带参数的图片,请使用此代码,

             // 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 我已经使用上面相同的代码完成了这项工作。请检查您的 php 服务,图像是多类型和八位字节流。
            • 我的 php 服务很好,我最终切换到 SRWebClient 并且它运行良好
            • @inVINCEable 很高兴你的任务已经完成。感谢您介绍 SRWebClient。
            • -1 用于使用NSURLConnection.sendSynchronousRequest。改用 NSURLSession,不要发送同步网络请求!
            【解决方案11】:

            这样试试

            @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

            【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-01
            • 2017-04-23
            • 1970-01-01
            • 2018-01-19
            • 2016-06-07
            相关资源
            最近更新 更多