2016-07-23 98 views
0

我隨後在線教程從swift上傳圖片到服務器。我用他的示例界面,一切都很好,除了我得到錯誤「消息」:「對不起,上傳文件時出現錯誤。」,「狀態」:錯誤,「userId」:「9」。我的代碼是通過php上傳圖片swift到服務器

<?php 
    $firstName = $_POST["firstName"]; 
    $lastName = $_POST["lastName"]; 
    $userId = $_POST["userId"]; 

    $target_dir = "percyteng.com/orbit/ios/image";if(!file_exists($target_dir)) 
    { 
    mkdir($target_dir, 0777, true); 
    } 

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

    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"] 
    ]); 

    } 
    ?> 

我已檢查並且參數確實從swift傳遞。 這是我的代碼在迅速。

import UIKit 

    class ViewController: UIViewController, UIPickerViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 


    @IBOutlet weak var image: UIImageView! 
    @IBOutlet weak var myActivityIndicator: UIActivityIndicatorView! 

     override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     self.view.endEditing(true) 
    } 

    @IBAction func selectImage(sender: AnyObject) { 
     let ImagePicker = UIImagePickerController() 
     ImagePicker.delegate = self 
     ImagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary 

     self.presentViewController(ImagePicker, animated: true, completion: nil) 
    } 
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

     image.image = info[UIImagePickerControllerOriginalImage] as? UIImage 
     self.dismissViewControllerAnimated(true, completion: nil) 

    } 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

    } 

    @IBAction func Upload(sender: AnyObject) { 
     myImageUploadRequest() 
    } 
    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
    func myImageUploadRequest() 
    { 

     let myUrl = NSURL(string: "http://www.percyteng.com/orbit/ios/try.php"); 
     //let myUrl = NSURL(string: "http://www.boredwear.com/utils/postImage.php"); 

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

     let param = [ 
      "firstName" : "Sergey", 
      "lastName" : "Kargopolov", 
      "userId" : "9" 
     ] 

     let boundary = generateBoundaryString() 

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


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

     if(imageData==nil) { return; } 

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



     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 

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

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

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

      do { 
       if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary { 
        print(jsonResult) 
       } 
      } catch let error as NSError { 
       print(error.localizedDescription) 
      } 


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

      /* 
      if let parseJSON = json { 
      var firstNameValue = parseJSON["firstName"] as? String 
      println("firstNameValue: \(firstNameValue)") 
      } 
      */ 

     } 

     task.resume() 

    } 


    func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData { 
     var 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 NSMutableData { 

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

回答

0

你的iOS代碼工作對我來說,如果我用move_uploaded_file()在PHP腳本將圖像從臨時文件路徑移動到現有目錄我的服務器上,這樣我就不會遇到創建目錄的問題(我也評論了響應的json轉換)。因此,請求正文中的邊界都是正確創建的。

我懷疑move_uploaded_file()由於目錄問題而失敗。嘗試這樣的事情:

if(!file_exists($target_dir)) 
{ 
    mkdir($target_dir, 0777, true) or exit("Couldn't create $target_dir!"); 

} 
+0

是的,我剛纔發現我的問題。我只需要像「image」那樣編寫我的traget_dir。感謝壽 –