简体   繁体   English

无法在 iOS 上使用 Swift 将 base64 字符串发送到服务器

[英]Unable to send base64 String to server in Swift on iOS

In my application I have pick the image using UIImagePickerController from photos and then compress and convert to base64 string .在我的应用程序中,我使用UIImagePickerController从照片中选择图像,然后压缩并转换为base64 string Finally I upload the base64 string to server.最后我将 base64 字符串上传到服务器。 Here the server was not accept the base64 string and does not work, but in Android and Postman it works well.这里服务器不接受base64 string并且不起作用,但在 Android 和 Postman 中它运行良好。 I couldn't find the mistake in my code.我在我的代码中找不到错误。

Here I mention the UIImagePickerControllerDelegate:这里我提到了 UIImagePickerControllerDelegate:

// MARK: UIImagePickerControllerDelegate
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    dismiss(animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    selectedImage = selectedImage.resizeWithWidth(width: 700)!
    picker.dismiss(animated: true, completion: nil)
    DispatchQueue.main.async {
        self.collPhotos.reloadData()
    }
}

Here I mention the Base64 Conversion and post the parameter string to server:这里我提到Base64转换并将参数字符串发送到服务器:

func addImagesApiCAll() {
    let imagedata1:UIImage = selectedImage as! UIImage
    let compressData = UIImagePNGRepresentation(imagedata1)
    let base64 = compressData?.base64EncodedString(options: .lineLength64Characters)
    print("charCount",base64!.count)

    if Reachability()!.isReachable {
        let id = Singleton.sharedInstance.selectedCategory!
        let parameterStr = "property_id=\(self.PropertyID)&photos=\(base64!)&lang_code=\(lanuguage_selection.value(forKey: "language") ?? "en")&base_id=\(id)&user_id=\(login_session.value(forKey: "UserId")!)"
        Network.shared.POSTRequest(withParameterString: parameterStr, serviceURL: SAVE_PHOTO_LISTING, APIKEY: "SAVE_PHOTO_LISTING")
    } else {
        showInformation(title: "Network Error", message: "Please check your internet connection")
    }
}

extension AddPhotoViewController: HTTP_POST_STRING_REQUEST_PROTOCOL {
func httpPostRequest(APIKEY: String, requestURL: String, responseDict: NSDictionary, errorDict: String) {
    ListingActivityDelegate.hideActivity()
    if APIKEY == "SAVE_PHOTO_LISTING"{
       if errorDict.count == 0 {
        print(responseDict)
        let mod = RentYourSpaceModel(fromDictionary: responseDict as! [String : Any])
        if mod.status! != 0 {
           Singleton.sharedInstance.rentYourSpace = mod
            if Singleton.sharedInstance.rentYourSpace.result[0].step5.productImage.count == 0{
                imageFromResponse = "NO"
            } else {
                imageFromResponse  = "YES"
            }
        }
        self.showInformation(title: "Application", message: mod.message)
    }
       else {

  }
}
}
}

Here I mention the code for Select Image from Camera or Gallery:这里我提到从相机或图库中选择图像的代码:

@IBAction func act_AddPhoto(_ sender: UIButton) {
    let actionSheet = UIAlertController(title: "Home Stay", message: "Choose Image", preferredStyle: .actionSheet)
    actionSheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in
        self.openCamera()
    }))
    actionSheet.addAction(UIAlertAction(title: "Photos", style: .default, handler: { _ in
        self.openGallary()
    }))
    actionSheet.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))
    //If you want work actionsheet on ipad then you have to use popoverPresentationController to present the actionsheet, otherwise app will crash in iPad
    switch UIDevice.current.userInterfaceIdiom {
    case .pad:
        actionSheet.popoverPresentationController?.sourceView = sender
        actionSheet.popoverPresentationController?.sourceRect = sender.bounds
        actionSheet.popoverPresentationController?.permittedArrowDirections = .up
    default:
        break
    }
    self.present(actionSheet, animated: true, completion: nil)
}

//MARK: - Open the camera
func openCamera() {
    if(UIImagePickerController .isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)){
        imagePicker.sourceType = UIImagePickerControllerSourceType.camera
        //If you dont want to edit the photo then you can set allowsEditing to false
        imagePicker.allowsEditing = true
        imagePicker.delegate = self
        self.present(imagePicker, animated: true, completion: nil)
    }
    else{
        let alert  = UIAlertController(title: "Warning", message: "You don't have camera", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
}

//MARK: - Choose image from camera roll
func openGallary(){
    imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
    //If you dont want to edit the photo then you can set allowsEditing to false
    imagePicker.allowsEditing = true
    imagePicker.delegate = self
    self.present(imagePicker, animated: true, completion: nil)
}

Here I give the POSTRequest Method:这里我给出POSTRequest方法:

//MARK:- Post request with parameter String.
func POSTRequest(withParameterString: String , serviceURL: String , APIKEY: String)
{
    var RESPONSE_ERROR = String()
    var RESPONSE_DATA = NSDictionary()
    let Url = String(format: serviceURL)
    guard let serviceUrl = URL(string: Url) else { return }
    var request = URLRequest(url: serviceUrl)
    let postString = withParameterString
 //   print(postString)
    request.httpBody = postString.data(using: String.Encoding.utf8);
  //request.addValue("application/json", forHTTPHeaderField: "content-type")
    request.httpMethod = "POST"
    let task = URLSession.shared.dataTask(with: request, completionHandler: {
        data, response, error in
        if let response = response {
            print(response)
        }
        if let resdata = data {
            do {

              //  print(response)

                let json =  try JSONSerialization.jsonObject(with: resdata, options: .mutableContainers) as? NSDictionary

                   if let parseJSON = json {

                      //print(json)
                    if parseJSON.object(forKey: "status") as! NSInteger == 1 {
                        if error != nil {
                           RESPONSE_ERROR = (error?.localizedDescription)!
                        }
                        DispatchQueue.main.async {
                            RESPONSE_DATA = parseJSON
                            self.HTTP_POST_STRING_REQUEST_DELEGATE?.httpPostRequest(APIKEY: APIKEY, requestURL: serviceURL, responseDict: RESPONSE_DATA, errorDict: RESPONSE_ERROR)
                        }
                    } else {
                        DispatchQueue.main.async {
                             RESPONSE_DATA = parseJSON
                            self.HTTP_POST_STRING_REQUEST_DELEGATE?.httpPostRequest(APIKEY: APIKEY, requestURL: serviceURL, responseDict: RESPONSE_DATA, errorDict: RESPONSE_ERROR)
                        }
                    }
                } else {
                    DispatchQueue.main.async {
                        RESPONSE_ERROR = "No Data"
                        self.HTTP_POST_STRING_REQUEST_DELEGATE?.httpPostRequest(APIKEY: APIKEY, requestURL: serviceURL, responseDict: RESPONSE_DATA, errorDict: RESPONSE_ERROR)
                    }
                }
            }catch {
                 DispatchQueue.main.async {
                RESPONSE_ERROR = "Check your input datas"
                self.HTTP_POST_STRING_REQUEST_DELEGATE?.httpPostRequest(APIKEY: APIKEY, requestURL: serviceURL, responseDict: RESPONSE_DATA, errorDict: RESPONSE_ERROR)
            }
            }
        } else {
            DispatchQueue.main.async {
                RESPONSE_ERROR = (error?.localizedDescription)!
                self.HTTP_POST_STRING_REQUEST_DELEGATE?.httpPostRequest(APIKEY: APIKEY, requestURL: serviceURL, responseDict: RESPONSE_DATA, errorDict: RESPONSE_ERROR)
            }
        }
    })
    task.resume()
}

It looks like you are trying to send base64 string as query string.看起来您正在尝试将 base64 字符串作为查询字符串发送。 It would be too long to be a query string.作为查询字符串太长了。 You need to share details for POSTRequest method.您需要共享 POSTRequest 方法的详细信息。 For more information.想要查询更多的信息。

Network.shared.POSTRequest(withParameterString: parameterStr, serviceURL: SAVE_PHOTO_LISTING, APIKEY: "SAVE_PHOTO_LISTING")

And you need to avoid using exclamation (.) in your application.并且您需要避免在应用程序中使用感叹号 (.)。 Your code would crash in many points: For example:您的代码会在很多方面崩溃:例如:

if Reachability()?.isReachable

You can use optional values to prevent crashes.您可以使用可选值来防止崩溃。

 let parameters = ["property_id":self.PropertyID,
                "photos":base64 ?? "",
                "lang_code":lanuguage_selection.value(forKey: "language") ?? "en",
                "base_id":id,
                "user_id":login_session.value(forKey: "UserId") ?? ""];
 Network.shared.POSTRequest(parameters: parameters, serviceURL: SAVE_PHOTO_LISTING, APIKEY: "SAVE_PHOTO_LISTING")

in method add json data:在方法中添加 json 数据:

if let jsonData = try? JSONSerialization.data(withJSONObject: parameters) {
    request.httpBody?.append(jsonData)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM