[英]How to Upload Multiple Images in Swift
我試圖在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。
我不明白我做錯了什么。 請幫忙?
/**
* @brief this is a generic method use to Post method API call uploading multiple images array with multipart
* @param url : String
* @param arrayImageData:NSMutableArray
* @param imageParamKey:String
* @param parameters:Parameters
* @param isHeaderIncluded : Bool
* @param headers : HTTPHeaders
* @return completion block which return data dictionary
**/
public func RequestApiMultipleImages(url:String,imageParamKey:String, arrayImageData:NSMutableArray, parameters:Parameters,isHeaderIncluded:Bool, headers:HTTPHeaders, completion: @escaping (_ result: DataResponse<Any>) -> Void) {
if(isHeaderIncluded) {
Alamofire.upload(multipartFormData: { multipartFormData in
// import image to request
for imageData in arrayImageData {
multipartFormData.append(imageData as! Data, withName: imageParamKey+"[]", fileName: "\(Date().timeIntervalSince1970).jpeg", mimeType: "image/jpeg")
}
for (key, value) in parameters {
multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
}
}, to:url,headers:headers)
{
(result) in
switch result {
case .success(let upload,_,_ ):
upload.uploadProgress(closure: { (progress) in
//Print progress
print(progress)
})
//To check and verify server error
/*upload.responseString(completionHandler: { (response) in
print(response)
print (response.result)
})*/
upload.responseJSON
{ response in
switch response.result {
case .success:
print(response)
completion(response)
break
case .failure(let error):
print(error)
completion(response)
}
}
case .failure(_):
print(result)
// completion(responds)
}
}
}
else
{
Alamofire.upload(multipartFormData: { multipartFormData in
// import image to request
for imageData in arrayImageData {
multipartFormData.append(imageData as! Data, withName: imageParamKey+"[]", fileName: "\(Date().timeIntervalSince1970).jpeg", mimeType: "image/jpeg")
}
for (key, value) in parameters {
multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
}
}, to:url)
{
(result) in
switch result {
case .success(let upload,_,_ ):
upload.uploadProgress(closure: { (progress) in
//Print progress
print(progress)
})
//To check and verify server error
/*upload.responseString(completionHandler: { (response) in
print(response)
print (response.result)
})*/
upload.responseJSON
{ response in
switch response.result {
case .success:
print(response)
completion(response)
break
case .failure(let error):
print(error)
completion(response)
}
}
case .failure(_):
print(result)
// completion(responds)
}
}
}
}
試試這里是工作代碼
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
}
}
}
您可以使用此塊在 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)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.