2017-03-09 76 views
0

我试图发送一个图像(从用户使用UIImagePickerController),到一个正在寻找物理文件的API。 JPEG或PNG都可以...使用此代码...我如何格式化它以发送?通过HTTPS POST发送图像?

我的POST功能......的“(图像变量)”中的postString应该是图像文件...

var request = URLRequest(url: URL(string: "web address.php")!) 
      request.httpMethod = "POST" 
      let postString = "action=setDefendentData&username=\("\(userNameString!)")&datetime=\(localDate)&latitude=\(latitude!)&longitude=\(longitude!)&image=\(image variable)" 
      request.httpBody = postString.data(using: .utf8) 
      let task = URLSession.shared.dataTask(with: request) { data, response, error in 
       guard let data = data, error == nil else { 

        OperationQueue.main.addOperation{ 
         loginAlertPopup(title: "Error", message: "Invalid Source: Check Internet Connection") 
        } 

        // check for fundamental networking error 
        print("error=\(error)") 
        return 
       } 

       if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
        print("statusCode should be 200, but is \(httpStatus.statusCode)") 
        print("response = \(response)") 

       } 

       let responseString = String(data: data, encoding: .utf8) 

       if responseString! == "success" { 
        print("Good") 

        // Success Alert \\ 
        self.presentAlert(title: "Success", message: "Check-In has been updated!") 
       } 

       if responseString! == "fail" { 

        print("failed sending image") 
        print("Post String: \(postString)") 
        // Alert Error \\ 

        OperationQueue.main.addOperation{ 
         self.presentAlert(title: "Error", message: "Failed Sending Data") 
        } 
       } 
      } 
      task.resume() 
     } 

这是我的代码保存使用的UIImagePickerController的图像数据:

let fileDirectory : NSURL = { 
      return try! FileManager.default.url(for: .documentDirectory , in: .userDomainMask , appropriateFor: nil, create: true) 
     }() as NSURL 

     let imageQuality: CGFloat = 0.5 
     let image = info[UIImagePickerControllerOriginalImage] as! UIImage 

      // Saves to App Data 
     let imagePath = fileDirectory.appendingPathComponent("uploadImage.jpg") 
     guard let imageData = UIImageJPEGRepresentation(image, imageQuality) else { 
      // handle failed conversion 
      presentAlert(title: "Error", message: "Image Failure") 
      print("jpg error") 
      return 
     } 
     try! imageData.write(to: imagePath!) 
      print("Image Path: \(imagePath!)") 
      print("Image Size: \(imageData)") 

     //Get Image 
     let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) 
     if let dirPath = documentPath.first{ 
      let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent("uploadImage.jpg") 
      let newImage = UIImage(contentsOfFile: imageURL.path) 

我试过发送通过image变量(在这种情况下为newImage),它不接受它。我在我的视图控制器上创建了一个临时UIImageView来显示newImage,并相应地进行了更新... API处理程序不接受它。

任何信息/帮助吗?

+0

http://stackoverflow.com/questions/16434537/post-image-to-server-in-iphone图像 –

回答

0

您不能把图像变量在该职位字符串这样

let postString = "action=setDefendentData&username=\("\(userNameString!)")&datetime=\(localDate)&latitude=\(latitude!)&longitude=\(longitude!)&image=\(image variable)" 
    request.httpBody = postString.data(using: .utf8) 

相反上传图片,你的帖子的网址应该是这样的:

yourUrlDomain/action=setDefendentData&username=\("\(userNameString!)")&datetime=\(localDate)&latitude=\(latitude!)&longitude=\(longitude!) 

而且你必须张贴的图片附加到httpBody的数据。

NSMutableData *body = [NSMutableData data]; 

// Add __VIEWSTATE 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"Content-Disposition: form-data; name=\"__VIEWSTATE\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[@"/wEPDwUKLTQwMjY2MDA0M2RkXtxyHItfb0ALigfUBOEHb/mYssynfUoTDJNZt/K8pDs=" dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 

// add image data 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 
if (imageData) { 
    NSString *imageName = @"Any name you want"; 
    NSString *contentDisposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"imagefile\"; filename=\"%@\"\r\n",imageName]; 
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[contentDisposition dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:imageData]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
} 

[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

[request setHTTPBody:body]; 

不幸的是,我为我的Objective-C iOS应用程序制作了这段代码,但我对Swift并不熟悉。但你得到的照片。

0
Use Alamofire for image upload -   
func makePostRequestForUploadingImage(_ service : String!, imageData  : Data?, responseCallBack : APIClientResponseCallBack!) { 
    let urlString = self.urlStringWithService(service) 
    Alamofire.upload(multipartFormData: { (multipartFormData) in 
     if let _ = imageData { 

      multipartFormData.append(imageData!, withName: "", fileName: "", mimeType: "image/jpg") 

     } 
    }, to: urlString) { (encodingresult) in 
     switch encodingresult { 

     case .success(let upload, _, _): 
      upload.responseJSON { response in 
       responseCallBack? (response.response?.statusCode,response.result.value as AnyObject? , response.result.error as NSError?) 
      } 
     case .failure(let encodingError): 
      print(encodingError) 
     } 
    } 

} 

    static func createBodyForMultiPart(input:Any, previousString:String,multipartFormData: MultipartFormData) { 

    print("previousString -- ", previousString) 

    if let dic = input as? [String:Any] { 

     for key in dic.keys { 
      self.createBodyForMultiPart(input: dic[key]!, previousString: previousString != "" ? (previousString + "[\(key)]") : "\(key)",multipartFormData: multipartFormData) 
     } 
    } 
    else if let array = input as? [Any] { 

     for i in 0..<array.count{ 

      self.createBodyForMultiPart(input: array[i], previousString: previousString + "[\(i)]",multipartFormData: multipartFormData) 
     } 

    } 
    else if let number = input as? Int { 

     multipartFormData.append(String(number).data(using:String.Encoding.utf8,allowLossyConversion:false)!, withName: previousString) 


    } 
    else if let text = input as? String{ 

     multipartFormData.append(text.data(using:String.Encoding.utf8,allowLossyConversion :false)!, withName: previousString) 

    } 
    else if let image = input as? UIImage { 

     multipartFormData.append(UIImageJPEGRepresentation(image, 0.2)!, withName: previousString, fileName: "inspectionitem.jpeg", mimeType: "image/jpg") 


    } 
    else if let floatNumber = input as? Float { 

     multipartFormData.append(String(floatNumber).data(using:String.Encoding.utf8,allowLossyConversion :false)!, withName: previousString) 


    } 


} 

设置你的参数,包括你需要上传的参数字典