Ios 如何使用Alamofire将多部分图像上载到服务器
下面提到的是我将多部分图像上传到服务器的方法,但当我尝试这样做时,应用程序正在崩溃“意外发现nill” 但当我从照片库中选择它时,图像的价值就在那个里Ios 如何使用Alamofire将多部分图像上载到服务器,ios,swift,xcode,alamofire,multipartform-data,Ios,Swift,Xcode,Alamofire,Multipartform Data,下面提到的是我将多部分图像上传到服务器的方法,但当我尝试这样做时,应用程序正在崩溃“意外发现nill” 但当我从照片库中选择它时,图像的价值就在那个里 func createCoupon(_ code: String, storeID: Int, description: String, terms: String, image: UIImage, startDate: String, endDate: String, couponDiscount: String, minimumDiscoun
func createCoupon(_ code: String, storeID: Int, description: String, terms: String, image: UIImage, startDate: String, endDate: String, couponDiscount: String, minimumDiscount: String, percentage: String, maximumDiscount: String){
let urlString = BaseURL + "create-coupon"
let params =
[
"code" : code,
"store_id" : storeID,
"type" : "merchant",
"description" : description,
"terms" : terms,
"start_date" : startDate,
"end_date" : endDate,
"coupon_discount" : couponDiscount,
"minimum_total" : minimumDiscount,
"percentage" : percentage,
"maximum_discount" : maximumDiscount
] as [String : Any]
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 30000
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(UIImageJPEGRepresentation(image, 0.2)!, withName: "image", fileName: "swift_file.jpeg", mimeType: "image/jpeg")
for (key, value) in params {
multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
}
}, to:urlString)
{
(result) in
switch result {
case .success(let upload, _, _):
upload.uploadProgress(closure: { (progress) in
//Print progress
})
upload.responseJSON { response in
let resJson = response.result.value
print(resJson)
NotificationCenter.default.post(name: Notification.Name(rawValue: NotifRequestSuccess.createCoupon.rawValue), object: nil, userInfo: ["data": resJson!])
}
case .failure(let encodingError):
NotificationCenter.default.post(name: Notification.Name(rawValue: NotifRequestError.createCoupon.rawValue), object: encodingError, userInfo: nil)
}
}
只需简单地将此函数用作
/// Data for image
var userImageString = Data()
/// Convert Image to Data
func convertImageToData(image: UIImage) -> Data {
let imageData = UIImageJPEGRepresentation(image, 0.1)!
return imageData
}
///Conversion Method - with target size if required
userImageString = convertImageToData(image: resizeImage(image: img, targetSize: CGSize.init(width: 600, height: 600)))
//MARK: Data to server
func imageDataToServer(parameters: [String : AnyObject])
{
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(self.userImageString, withName: "parameter_name", fileName: "image.jpeg", mimeType: "image/jpeg")
for (key, value) in parameters
{
multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key)
}
}, to:"url", method: .post,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload,_,_):
upload.responseJSON { (response:DataResponse<Any>) in
print("RRRRR: \(response)")
if response.result.isSuccess
{
/// Success
}
else
{
/// Failure
}
}
upload.uploadProgress(closure: {
progress in
print(progress.fractionCompleted)
})
case .failure(let encodingError):
print(encodingError)
}
})
}
只需简单地将此函数用作
/// Data for image
var userImageString = Data()
/// Convert Image to Data
func convertImageToData(image: UIImage) -> Data {
let imageData = UIImageJPEGRepresentation(image, 0.1)!
return imageData
}
///Conversion Method - with target size if required
userImageString = convertImageToData(image: resizeImage(image: img, targetSize: CGSize.init(width: 600, height: 600)))
//MARK: Data to server
func imageDataToServer(parameters: [String : AnyObject])
{
Alamofire.upload(multipartFormData: { (multipartFormData) in
multipartFormData.append(self.userImageString, withName: "parameter_name", fileName: "image.jpeg", mimeType: "image/jpeg")
for (key, value) in parameters
{
multipartFormData.append(value.data(using: String.Encoding.utf8.rawValue)!, withName: key)
}
}, to:"url", method: .post,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload,_,_):
upload.responseJSON { (response:DataResponse<Any>) in
print("RRRRR: \(response)")
if response.result.isSuccess
{
/// Success
}
else
{
/// Failure
}
}
upload.uploadProgress(closure: {
progress in
print(progress.fractionCompleted)
})
case .failure(let encodingError):
print(encodingError)
}
})
}
使用
Alamofire
:Swift 3.0
var strImagePicked = [UIImage]() // declared as global variable ... this will be image picked from ImagePickerController
下面是用于从ImagePickerController
上载单个图像的函数,单击按钮上载图像时调用此方法
func imageuploadAPI(){
let params =
[
"code" : code,
"store_id" : storeID,
"type" : "merchant",
"description" : description,
"terms" : terms,
"start_date" : startDate,
"end_date" : endDate,
"coupon_discount" : couponDiscount,
"minimum_total" : minimumDiscount,
"percentage" : percentage,
"maximum_discount" : maximumDiscount
] as [String : Any]
Alamofire.upload(
multipartFormData: { MultipartFormData in
for (key, value) in params {
MultipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
}
for element in 0..<self.strImagePicked.count {
let singleImage : Data? = self.strImagePicked[element].lowestQualityJPEGNSData as Data?
MultipartFormData.append(singleImage!, withName: "image", fileName: "swift_file.jpg", mimeType: "image/jpeg")
//"image" is the parameter for image
}
}, to: "your_URL") { (result) in
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
print(response.result.value as Any)
}
case .failure(let encodingError):
print(encodingError)
break
}
}
}
// extension is used for image so that if image will be of hight quality it will reduce it's size
extension UIImage {
var highestQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 1.0)! as NSData }
var highQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 0.75)! as NSData}
var mediumQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 0.5)! as NSData }
var lowQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 0.25)! as NSData}
var lowestQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 0.0)! as NSData }
}
func imageuploadAPI(){
让params=
[
“代码”:代码,
“门店id”:门店id,
“类型”:“商户”,
“描述”:描述,
“条款”:条款,
“开始日期”:开始日期,
“结束日期”:结束日期,
“优惠券折扣”:耦合贴现,
“最低总额”:最低折扣,
“百分比”:百分比,
“最大折扣”:最大折扣
]as[字符串:任意]
阿拉莫菲尔上传(
multipartFormData:{multipartFormData in
用于参数中的(键、值){
MultipartFormData.append((值为AnyObject).data(使用:String.Encoding.utf8.rawValue)!,with name:key)
}
对于0..中的元素,使用下面的代码使用Alamofire上传单个图像
:Swift 3.0
var strImagePicked = [UIImage]() // declared as global variable ... this will be image picked from ImagePickerController
下面是用于从ImagePickerController
上载单个图像的函数,单击按钮上载图像时调用此方法
func imageuploadAPI(){
let params =
[
"code" : code,
"store_id" : storeID,
"type" : "merchant",
"description" : description,
"terms" : terms,
"start_date" : startDate,
"end_date" : endDate,
"coupon_discount" : couponDiscount,
"minimum_total" : minimumDiscount,
"percentage" : percentage,
"maximum_discount" : maximumDiscount
] as [String : Any]
Alamofire.upload(
multipartFormData: { MultipartFormData in
for (key, value) in params {
MultipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key)
}
for element in 0..<self.strImagePicked.count {
let singleImage : Data? = self.strImagePicked[element].lowestQualityJPEGNSData as Data?
MultipartFormData.append(singleImage!, withName: "image", fileName: "swift_file.jpg", mimeType: "image/jpeg")
//"image" is the parameter for image
}
}, to: "your_URL") { (result) in
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
print(response.result.value as Any)
}
case .failure(let encodingError):
print(encodingError)
break
}
}
}
// extension is used for image so that if image will be of hight quality it will reduce it's size
extension UIImage {
var highestQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 1.0)! as NSData }
var highQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 0.75)! as NSData}
var mediumQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 0.5)! as NSData }
var lowQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 0.25)! as NSData}
var lowestQualityJPEGNSData: NSData { return UIImageJPEGRepresentation(self, 0.0)! as NSData }
}
func imageuploadAPI(){
让params=
[
“代码”:代码,
“门店id”:门店id,
“类型”:“商户”,
“描述”:描述,
“条款”:条款,
“开始日期”:开始日期,
“结束日期”:结束日期,
“优惠券折扣”:耦合贴现,
“最低总额”:最低折扣,
“百分比”:百分比,
“最大折扣”:最大折扣
]as[字符串:任意]
阿拉莫菲尔上传(
multipartFormData:{multipartFormData in
用于参数中的(键、值){
MultipartFormData.append((值为AnyObject).data(使用:String.Encoding.utf8.rawValue)!,with name:key)
}
对于0..中的元素,我创建了一个func来满足您在本例中的需要。在下面的请求中,在“image”参数中传递UIImage
multipartUploadRequestWith(imageData: UIImageJPEGRepresentation(image, 1.0), parameters: params, onCompletion: {
print("Upload Successful")
}) { (error) in
print(error.debugDescription)
}
下面是该函数的代码
func multipartUploadRequestWith(imageData: Data?, parameters: [String : Any], onCompletion: (() -> Void)? = nil, onError: ((Error?) -> Void)? = nil){
let url = /* your API url */
let headers: HTTPHeaders = [
/* "Authorization": "your_access_token", in case you need authorization header */
"Content-type": "multipart/form-data",
]
print(headers)
Alamofire.upload(multipartFormData: { (multipartFormData) in
for (key, value) in parameters {
multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
}
if let data = imageData{
multipartFormData.append(data, withName: "photo", fileName: "photo.jpeg", mimeType: "image/jpeg")
}
}, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
switch result{
case .success(let upload, _, _):
upload.response { response in
if let err = response.error{
print("This error")
let alert = UIAlertController(title: "Upload Failed", message: "The image upload failed. Check your internet connection", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true, completion: nil)
onError?(err)
return
}
if response.response?.statusCode == 200 {
print("Succesfully uploaded")
onCompletion?()
} else {
print("Error " )
}
}
case .failure(let error):
print("Error in upload: \(error.localizedDescription)")
onError?(error)
}
}
}
在这种情况下,我创建了一个func来满足您的需要。在下面的请求中,在“image”参数中传递UIImage
multipartUploadRequestWith(imageData: UIImageJPEGRepresentation(image, 1.0), parameters: params, onCompletion: {
print("Upload Successful")
}) { (error) in
print(error.debugDescription)
}
下面是该函数的代码
func multipartUploadRequestWith(imageData: Data?, parameters: [String : Any], onCompletion: (() -> Void)? = nil, onError: ((Error?) -> Void)? = nil){
let url = /* your API url */
let headers: HTTPHeaders = [
/* "Authorization": "your_access_token", in case you need authorization header */
"Content-type": "multipart/form-data",
]
print(headers)
Alamofire.upload(multipartFormData: { (multipartFormData) in
for (key, value) in parameters {
multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
}
if let data = imageData{
multipartFormData.append(data, withName: "photo", fileName: "photo.jpeg", mimeType: "image/jpeg")
}
}, usingThreshold: UInt64.init(), to: url, method: .post, headers: headers) { (result) in
switch result{
case .success(let upload, _, _):
upload.response { response in
if let err = response.error{
print("This error")
let alert = UIAlertController(title: "Upload Failed", message: "The image upload failed. Check your internet connection", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true, completion: nil)
onError?(err)
return
}
if response.response?.statusCode == 200 {
print("Succesfully uploaded")
onCompletion?()
} else {
print("Error " )
}
}
case .failure(let error):
print("Error in upload: \(error.localizedDescription)")
onError?(error)
}
}
}
试试这个
func callAPI( _ parameters:[String:Any] , url:String) {
print(parameters)
let uploadImageProfileURL = url
var urlRequest = URLRequest(url: URL(string:uploadImageProfileURL)!)
urlRequest.httpMethod = "POST"
urlRequest.allHTTPHeaderFields = [
"content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
"cache-control": "no-cache",
]
Alamofire.upload(multipartFormData: { multipartFormData in
for (key, value) in parameters {
if value is String {
multipartFormData.append((value as! String).data(using: String.Encoding.utf8)!, withName: key )
}
if value is UIImage {
let imgData = UIImageJPEGRepresentation(value as! UIImage, 1)!
multipartFormData.append(imgData, withName: key ,fileName: "file.jpg", mimeType: "image/jpg")
}
if value is Array<UIImage> {
let arrayValue = value as! [UIImage]
for image in arrayValue {
let fileName = "file\(arc4random()%1000).jpg"
let mimeType = "application/octet-stream" ?? "image/jpg"
let data = UIImageJPEGRepresentation(image, 1)
multipartFormData.append(data!, withName: "\(key)", fileName:fileName, mimeType: mimeType)
}
}
}},to:url,method: .post)
{ (result) in
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
if let JSON = response.result.value {
}
}
case .failure(let encodingError):
print(encodingError.localizedDescription)
}
}
}
func调用API(u参数:[String:Any],url:String){
打印(参数)
让uploadImageProfileURL=url
var urlRequest=urlRequest(url:url(字符串:uploadImageProfileURL)!)
urlRequest.httpMethod=“POST”
urlRequest.allHTTPHeaderFields=[
“内容类型”:“多部分/表单数据;边界=----WebKitFormBoundary7MA4YWxkTrZu0gW”,
“缓存控制”:“无缓存”,
]
上传(multipartFormData:{multipartFormData-in-in
用于参数中的(键、值){
如果值是字符串{
multipartFormData.append((值为!String).data(使用:String.Encoding.utf8)!,名称为:key)
}
如果值为UIImage{
设imgData=UIImageJPEGRepresentation(值为!UIImage,1)!
multipartFormData.append(imgData,withName:key,fileName:file.jpg,mimeType:image/jpg)
}
如果值为数组{
让arrayValue=值为![UIImage]
对于arrayValue中的图像{
让fileName=“file\(arc4random()%1000).jpg”
让mimeType=“应用程序/八位字节流”?“图像/jpg”
让数据=UIImageJPEG表示(图像,1)
multipartFormData.append(data!,名称:“\(key)”,文件名:fileName,mimeType:mimeType)
}
}
}},收件人:url,方法:。post)
(结果)
切换结果{
成功案例(让我们上传,,u):
upload.responseJSON{中的响应
如果让JSON=response.result.value{
}
}
案例失败(let encodingError):
打印(编码错误。本地化描述)
}
}
}
试试这个
func callAPI( _ parameters:[String:Any] , url:String) {
print(parameters)
let uploadImageProfileURL = url
var urlRequest = URLRequest(url: URL(string:uploadImageProfileURL)!)
urlRequest.httpMethod = "POST"
urlRequest.allHTTPHeaderFields = [
"content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW",
"cache-control": "no-cache",
]
Alamofire.upload(multipartFormData: { multipartFormData in
for (key, value) in parameters {
if value is String {
multipartFormData.append((value as! String).data(using: String.Encoding.utf8)!, withName: key )
}
if value is UIImage {
let imgData = UIImageJPEGRepresentation(value as! UIImage, 1)!
multipartFormData.append(imgData, withName: key ,fileName: "file.jpg", mimeType: "image/jpg")
}
if value is Array<UIImage> {
let arrayValue = value as! [UIImage]
for image in arrayValue {
let fileName = "file\(arc4random()%1000).jpg"
let mimeType = "application/octet-stream" ?? "image/jpg"
let data = UIImageJPEGRepresentation(image, 1)
multipartFormData.append(data!, withName: "\(key)", fileName:fileName, mimeType: mimeType)
}
}
}},to:url,method: .post)
{ (result) in
switch result {
case .success(let upload, _, _):
upload.responseJSON { response in
if let JSON = response.result.value {
}
}
case .failure(let encodingError):
print(encodingError.localizedDescription)
}
}
}
func调用API(u参数:[String:Any],url:String){
打印(参数)
让uploadImageProfileURL=url
var urlRequest=urlRequest(url:url(字符串:uploadImageProfileURL)!)
urlRequest.httpMethod=“POST”
urlRequest.allHTTPHeaderFields=[
“内容类型”:“多部分/表单数据;边界=----WebKitFormBoundary7MA4YWxkTrZu0gW”,
“缓存控制”:“无缓存”,
]
上传(multipartFormData:{multipartFormData-in-in
用于参数中的(键、值){
如果值是字符串{
multipartFormData.append((值为!String).data(使用:String.Encoding.utf8)!,名称为:key)
}
如果值为UIImage{
设imgData=UIImageJPEGRepresentation(值为!UIImage,1)!
multipartFormData.append(imgData,withName:key,fileName:file.jpg,mimeType:image/jpg)
}
如果值为数组{
让arrayValue=值为![UIImage]
对于arrayValue中的图像