2016-07-23 188 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。感谢寿 –