Как загрузить несколько изображений в Swift - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь загрузить несколько изображений на сервер с помощью Alamofire, и для выбора нескольких изображений я использовал BSImagePicker pod.

Я создал две переменные для хранения нескольких изображений

//Mark:- storing multiple images
var SelectedAssets = [PHAsset]()
var PhotoArray = [UIImage]()

И это код, который я написал, чтобы открыть BSImagePicker при нажатии кнопки.

@IBAction func browseButtonTapped(_ sender: UIButton) {

    let vc = BSImagePickerViewController()
    vc.maxNumberOfSelections = 3
    //display picture gallery
    self.bs_presentImagePickerController(vc, animated: true,
                                         select: { (asset: PHAsset) -> Void in

    }, deselect: { (asset: PHAsset) -> Void in
        // User deselected an assets.

    }, cancel: { (assets: [PHAsset]) -> Void in
        // User cancelled. And this where the assets currently selected.
    }, finish: { (assets: [PHAsset]) -> Void in
        // User finished with these assets
        for i in 0..<assets.count
        {
            self.SelectedAssets.append(assets[i])

        }

        self.convertAssetToImages()

    }, completion: nil)

}

И код для преобразования активов в изображения

func convertAssetToImages() -> Void {

    if SelectedAssets.count != 0{

        for i in 0..<SelectedAssets.count{

            let manager = PHImageManager.default()
            let option = PHImageRequestOptions()
            var thumbnail = UIImage()
            option.isSynchronous = true

            manager.requestImage(for: SelectedAssets[i], targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: option, resultHandler: {(result, info)->Void in
                thumbnail = result!
                self.PhotoArray.append(thumbnail) // here I stored it in photoArray
            })

        }
    }

}

Теперь это код загрузки нескольких изображений

 func uploadMultipleImagesToServer(postId: String) {

    print(userDetail.getUserID())
    let param: [String:Any] = ["user_id": String.getString(userDetail.getUserID()), "post_id": postId]
    var image = [UIImage()]
    image = self.PhotoArray

    print(image)

    Alamofire.upload(multipartFormData: { (multipartFormData) in

        image.indices.forEach {
            multipartFormData.append(image[$0].jpegData(compressionQuality:0.8)!, withName: "file[\($0)]", fileName: "swift_file\($0).jpeg", mimeType: "image/jpeg")
        }

        for (key, value) in param {
            multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key)
        }
    }, to: Constants.BASE_URL+"upload_image.php")
    { (result) in
        switch result {
        case .success(let upload, _, _):

            upload.uploadProgress(closure: { (progress) in
                //Print progress
                print("uploading \(progress)")
            })
            upload.responseJSON { response in
                //print response.result
                guard let json = response.result.value as? [String:Any] else {return}
                print(json)
                guard let status = json["status"] as? String else {return}
                print(status)
                if status == "1" {
                    guard let message = json["message"] as? String else {return}
                    print(message)
                    //                        self.showNormalAlertWithTitle("Success", message: message)
                    self.navigationController?.popViewController(animated: true)
                } else if status == "0" {
                    guard let message = json["message"] as? String else {return}
                    print(message)
                    //    self.showNormalAlertWithTitle("Alert!", message: message)
                }
                else {
                }
            }
        case .failure( _): break
            //print encodingError.description
        }
    }
}

Но это дает мне ошибку, что

Загрузить действительные изображения. Разрешены только PNG и JPEG.

Я не понимаю, что я делаю неправильно. Пожалуйста, помогите?

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Вы можете использовать этот блок для хранения нескольких изображений на json

        let bodyImages:NSMutableArray = NSMutableArray()
    for i in 0..<products.count
    {

        let base64String = products[i]
        //print(base64String)
        let dict:NSDictionary = ["customer_company_images" : base64String]
        bodyImages.add(dict)
        print(bodyImages)

    }
0 голосов
/ 10 июля 2019

Попробуйте вот этот рабочий код

func callPostApiMultipleImage(api:String, parameters:[String:AnyObject]?,arr_images:[UIImage],Name:String, mime_type:String = "image/jpg", File_name:String = "image_" + String(arc4random()) + ".jpg", complition:@escaping (AnyObject)->Void){

        Alamofire.upload(multipartFormData: { (multipartFormData) in

            for i in 0..<arr_images.count{
                multipartFormData.append(arr_images[i].jpegData(compressionQuality: 0.1)!, withName: Name + "\(i)", fileName: File_name, mimeType: mime_type)
            }

        }, to:api){ (result) in

            switch result {

            case .success(let upload, _, _):

                upload.uploadProgress(closure: { (progress) in
                    print(progress)
                })

                upload.responseJSON { response in

                    print(response.result)

                    do {

                        let jsonDict = try JSONSerialization.jsonObject(with: (response.data as Data?)!, options: []) as? [String:AnyObject]

                        if response.result.error != nil{

                            print(response.result.error as Any, terminator: "")

                        }

                        if jsonDict == nil

                        {
                            print("Whoops, Something went wrong. Please, try after sometime.")
                            return

                        }

                        print(jsonDict as Any, terminator: "")

                        if response.result.isSuccess

                        {
                            complition(jsonDict as AnyObject)
                        }

                    }catch let error as NSError {

                        print("json error: \(error.localizedDescription)")

                    } catch _ {

                        print("Exception!")
                        print("Whoops, Something went wrong. Please, try after sometime.")
                    }

                }

            case .failure(let encodingError):

                print("",encodingError.localizedDescription)
                break

            }
        }
    }
...