2017-06-12 175 views
0

我想使用swift將我的圖像數據存儲在iOS服務器上。我試過下面的代碼,但它不工作我必須做什麼改變?如何在iOS上將圖像數據上傳到服務器?

想上傳6張圖片。 this is my controller view, after clicking save it want to store at server

func myImageUploadRequest() 
{ 

    let myUrl = NSURL(string: "http://easemyshop.in/upload_test/new.php"); 
    //let myUrl = NSURL(string: "http://easemyshop.in/upload_test/new.php"); 

    let request = NSMutableURLRequest(url:myUrl! as URL); 
    request.httpMethod = "POST"; 

    let param = [ 


     "tag" : "all", 
     "count" : "1", 
     "shopname" : "MayurShop", 
     "partyName" : "Paras", 
     "cur_date" : "14-06-2017", 
     "due_date" : "20-06-2017", 
     "karagir" : "Santra", 
     "remark" : "Urgent", 
     "order_status" : "Order Reccived" 

    /* 
     "firstName" : "Mayur", 
     "lastName" : "Shinde", 
     "userId" : "101" 

     */ 
    ] 

    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(parameters: param, filePathKey: "file", imageDataKey: imageData! as NSData, boundary: boundary) as Data 

    myActivityIndicator.isHidden = false 
    myActivityIndicator.startAnimating(); 

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

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

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

     // Print out reponse body 
     let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 

     print("\n\n****** response data *******\n\n") 
     print("\(responseString!)") 
     print("\n\n**************************\n\n") 

     do 
     { 
      let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary 

      print("\n\n*************\n\n") 
      print(json!) 
      print("\n\n*************\n\n") 

      DispatchQueue.main.async(execute: { 
       self.myActivityIndicator.stopAnimating() 
       self.myActivityIndicator.isHidden = true 
       //self.imageView?.image = nil; 
      }); 

     } 
     catch 
     { 
      print("\n\n*************ERROR******** => \(error)\n\n") 
     } 

    } 

    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(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 = "user-profile.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)" 
} 
+0

你得到什麼錯誤?還有服務器日誌中的任何內容? – geminiCoder

+0

@geminiCoder其doen顯示XCode中的任何錯誤。但仍未上傳到服務器上。在服務器上它顯示 - 這個目錄是空的。意味着數據沒有上傳! –

+0

所以我的第一個問題是,實際上被髮送到服務器的東西,即在服務器日誌中是否顯示POST?在Linux上,日誌通常在/ var/log /中查找apache或httpd,並且應該有一個訪問日誌。 – geminiCoder

回答

0
func webServiceImageUploadForMyProfile(image:UIImage,url:String,method:HTTPMethod,parameters : [String:AnyObject]?,completionHandler:@escaping (JSON?,String)->Void) { 

    let url = try! URLRequest(url: url, method: .post, headers: nil) 
    Alamofire.upload(multipartFormData:{ multipartFormData in 
     if let imageData = UIImageJPEGRepresentation(image, 0.6) { 
      multipartFormData.append(imageData, withName: "image", fileName: "Profile.png", mimeType: "image/png") 
     } 
     for (key, value) in parameters! { 
      multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key) 
     } 
     }, with: url, encodingCompletion: { 
      encodingResult in 
      switch encodingResult { 
      case .success(let upload, ,): 
       upload.uploadProgress(closure: { (progress) in 
        print("Upload Progress: \(progress.fractionCompleted)") 
       }) 
       upload.responseJSON { response in 
        if(response.result.isSuccess){ 
         if let data = response.result.value{ 
          let json = JSON(data) 
          print(json) 
          completionHandler(json,String()) 
          return 
         } 
        }else { 
         completionHandler(nil,(response.result.error?.localizedDescription)!) 
        } 
        } 

      case .failure(_): 

       break 
      } 
    }) 
} 

請嘗試...

0

請給下面的代碼將圖片上傳您的服務器上一試,也有一個替代文件名變量值要在其中發送將圖像文件發送到您的服務器。

func uploadImage(urlString:String,headers:[String:String]?,params:[String:String]?,image:UIImage?){ 
    let boundary: String = "------VohpleBoundary4QuqLuM1cE5lMwCy" 
    let contentType: String = "multipart/form-data; boundary=\(boundary)" 

    let request = NSMutableURLRequest() 
    if let tHeaders = headers { 
     for (key, value) in tHeaders { 
      request.setValue(value, forHTTPHeaderField: key) 
     } 
    } 
    request.httpShouldHandleCookies = false 
    request.timeoutInterval = 60 
    request.httpMethod = "POST" 
    request.setValue(contentType, forHTTPHeaderField: "Content-Type") 

    let body = NSMutableData() 
    if let parameters = params { 
     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)!) 
     } 
    } 
    //which field you have to sent image on server 
    let fileName: String = "file" 
    if image != nil { 
     body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!) 
     body.append("Content-Disposition: form-data; name=\"\(fileName)\"; filename=\"image.png\"\r\n".data(using: String.Encoding.utf8)!) 
     body.append("Content-Type:image/png\r\n\r\n".data(using: String.Encoding.utf8)!) 
     body.append(UIImagePNGRepresentation(image!)!) 
     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 
     if(error != nil){ 
      print(String(data: data!, encoding: .utf8) ?? "No response from server") 
     } 
    } 
    task.resume() 
} 

在你的PHP服務器,你可以得到你這樣的文件名

<?php 
    echo $_FILES['file']['name']; 
?> 
+0

如果您在傳遞「urlString:String」的情況下使用此方法,那麼讓body = NSMutableData() if參數=參數{key,value)參數{ 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)!) } } –