我正在使用Alamofire
按下按钮上传图像,但在
AF.upload(multipartFormData: {
MultipartFormData方法行
(注意:Alamofire 5.0更新后,Alamofire.upload更改为AF.upload)
@IBAction func btnUploadImage(_ sender: UIButton) {
let uploadDict = ["user_id":getUserId] as [String:String]
AF.upload(multipartFormData: { MultipartFormData in
let image :Data = UIImageJPEGRepresentation(self.uploadImg.image!, 1.0)!
MultipartFormData.append(image, withName: "image" , fileName: "image.jpeg" , mimeType: "image/jpeg")
for(key,value) in uploadDict{
MultipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)}
}, to: "http://XXXXXXXXXXXXXXXX/uploadImage", encodingCompletion: {
EncodingResult in
switch EncodingResult{
case .success(let upload, _, _):
upload.responseJSON { response in
debugPrint("SUCCESS RESPONSE: \(response)")
}
case .failure(let encodingError):
print("ERROR RESPONSE: \(encodingError)")
} })
//查看此代码的
导入UIKit 导入Alamofire
class updateVC:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
//MARK:- OUTLETS
@IBOutlet weak var tFeditName: UITextField!
@IBOutlet weak var tFusername: UITextField!
@IBOutlet weak var tFemail: UITextField!
@IBOutlet weak var uploadImg: UIImageView!
@IBOutlet weak var tVeditAddress: UITextView!
//MARK:- DECLARATIONS
var imagePicker = UIImagePickerController()
var editName = String()
var editUserName = String()
var editEmail = String()
var editImage = UIImage()
var editAddress = String()
var getUserId = String()
//MARK:- LIFE CYCLE
override func viewDidLoad() {
super.viewDidLoad()
imagePicker.delegate = self
tFeditName.text = editName
tFusername.text = editUserName
tFemail.text = editEmail
uploadImg.image = editImage
tVeditAddress.text = editAddress
}
//MARK:- CUSTOM FUNCTIONS
func postJSON() {
let param = ["fullname":tFeditName.text!,"username":tFusername.text!,"email":tFemail.text!,"address":tVeditAddress.text!,"user_id":getUserId] as NSDictionary
AF.request("http://XXXXXXXXXXXXXXXXXXXX/updatedetails", method: .post, parameters: param as? Parameters, encoding: URLEncoding.default).responseJSON { response in
switch response.result{
case .success(let json):
print(json)
DispatchQueue.main.async {
print(param)
}
case.failure(let Error):
print(Error)
}
}
}
//ImageViewPicker
func openCamera()
{
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.camera) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerController.SourceType.camera
imagePicker.allowsEditing = false
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)
}
}
func openGallery()
{
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.allowsEditing = true
imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
self.present(imagePicker, animated: true, completion: nil)
}
else
{
let alert = UIAlertController(title: "Warning", message: "You don't have permission to access gallery.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
internal func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
uploadImg.image = pickedImage
}
picker.dismiss(animated: true, completion: nil)
}
//MARK:- ACTIONS
@IBAction func btnSelectImage(_ sender: UIButton) {
let alert = UIAlertController(title: "Choose Image", message: nil, preferredStyle: .actionSheet)
alert.addAction(UIAlertAction(title: "Camera", style: .default, handler: { _ in
self.openCamera()
}))
alert.addAction(UIAlertAction(title: "Gallery", style: .default, handler: { _ in
self.openGallery()
}))
alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))
self.present(alert, animated: true, completion: nil)
}
@IBAction func btnUploadImage(_ sender: UIButton) {
let image: UIImage? = self.uploadImg.image
let uploadDict = ["user_id":getUserId] as [String:String]
AF.upload(multipartFormData: { MultipartFormData in
let image :Data = (image?.jpegData(compressionQuality: 1))!
MultipartFormData.append(image, withName: "image" , fileName: "image.jpeg" , mimeType: "image/jpeg")
for(key,value) in uploadDict{
MultipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)}
}, to: "http://XXXXXXXXXXXXXXXX/uploadImage", encodingCompletion: {
EncodingResult in
switch EncodingResult{
case .success(let upload, _, _):
upload.responseJSON { response in
debugPrint("SUCCESS RESPONSE: \(response)")
}
case .failure(let encodingError):
print("ERROR RESPONSE: \(encodingError)")
} })
}
@IBAction func btnUpdateDetails(_ sender: UIButton) {
postJSON()
self.navigationController?.popViewController(animated: true)
}
}
答案 0 :(得分:0)
我刚刚使用
安装了广告连播pod 'Alamofire', '~> 5.0.0-beta.5'
//示例代码
let image: UIImage? = self.uploadImg.image;
let uploadDict = ["user_id":getUserId] as [String:String]
Alamofire.upload(multipartFormData: { MultipartFormData in
let image :Data = (image?.jpegData(compressionQuality: 1))!
MultipartFormData.append(image, withName: "image" , fileName: "image.jpeg" , mimeType: "image/jpeg")
for(key,value) in uploadDict{
MultipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)}
}, to: "http://XXXXXXXXXXXXXXXX/uploadImage", encodingCompletion: {
EncodingResult in
switch EncodingResult{
case .success(let upload, _, _):
upload.responseJSON { response in
debugPrint("SUCCESS RESPONSE: \(response)")
}
case .failure(let encodingError):
print("ERROR RESPONSE: \(encodingError)")
} })
答案 1 :(得分:0)
摘自Alamofire 5.0迁移指南:
- MulitpartFormData的API已更改,用于创建和上传MultipartFormData的顶级上传方法已更新,以匹配其他请求API,因此不再需要处理multipart编码的结果。
所以您的代码应如下所示:
@IBAction func btnUploadImage(_ sender: UIButton) {
let uploadDict = ["user_id": "getUserId"] as [String:String]
AF.upload(multipartFormData: { MultipartFormData in
let image: Data = self.uploadImg.image!.jpegData(compressionQuality: 1.0)!
MultipartFormData.append(image, withName: "image" , fileName: "image.jpeg" , mimeType: "image/jpeg")
for(key,value) in uploadDict {
MultipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
}
}, to: "http://XXXXXXXXXXXXXXXX/uploadImage", method: .post, headers: ["Content-Type": "application/json",
"authorization": "bearer \(token)"])
.responseJSON { (response) in
debugPrint("SUCCESS RESPONSE: \(response)")
}
}
因此您将不需要encodingCompletion
结束并立即使用responseJSON。
答案 2 :(得分:0)
检查以下内容:
https://github.com/Alamofire/Alamofire/issues/2942
搜索“创建参数字典[String:Data],然后将条目追加到实际文件之前”