Swift-一步步教你上传头像

简介: Swift-一步步教你上传头像

先前有人私信我说上传有问题,博主确认了下,发现是路径的问题,把Object-C的代码转变成Swift后路径就出了问题,不知道原因,推测可能是Swift本身的问题,所以博主换了一种路径方式,大家注意,关于路径和文件操作的,后面博主要写一篇博客来进行说明,有兴趣的可以看看,或者自己查查资料。


上一篇中列出了Alamofire中GET和POST的使用方法,这里来介绍如何用Alamofire以表单形式来上传头像。


前面写过一篇Object-C的上传头像,这里代码是一样的,只是语言不一样,想看的请点击这里:http://blog.csdn.net/codingfire/article/details/51781194


下面来看看用Swift怎么来上传头像:

image.png

1.可拍照,可选择相册中图片:


AlertController前面单独说过,我们不陌生,需要看的就是UIImagePickerController了,

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let actionSheet = UIAlertController(title: "上传头像", message: nil, preferredStyle: .ActionSheet)
        let cancelBtn = UIAlertAction(title: "取消", style: .Cancel, handler: nil)
        let takePhotos = UIAlertAction(title: "拍照", style: .Destructive, handler: {
            (action: UIAlertAction) -> Void in
//判断是否能进行拍照,可以的话打开相机
            if UIImagePickerController.isSourceTypeAvailable(.Camera) {
                let picker = UIImagePickerController()
                picker.sourceType = .Camera
                picker.delegate = self
                picker.allowsEditing = true
                self.presentViewController(picker, animated: true, completion: nil)
            }
            else
            {
                print("模拟其中无法打开照相机,请在真机中使用");
            }
        })
        let selectPhotos = UIAlertAction(title: "相册选取", style: .Default, handler: {
            (action:UIAlertAction)
            -> Void in
            //调用相册功能,打开相册
            let picker = UIImagePickerController()
            picker.sourceType = .PhotoLibrary
            picker.delegate = self
            picker.allowsEditing = true
            self.presentViewController(picker, animated: true, completion: nil)
        })
        actionSheet.addAction(cancelBtn)
        actionSheet.addAction(takePhotos)
        actionSheet.addAction(selectPhotos)
        self.presentViewController(actionSheet, animated: true, completion: nil)
    }

2.选择一张照片后进入代理方法

 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        let type: String = (info[UIImagePickerControllerMediaType] as! String)
        //当选择的类型是图片
        if type == "public.image"
        {
            //修正图片的位置
            let image = self.fixOrientation((info[UIImagePickerControllerOriginalImage] as! UIImage))
            //先把图片转成NSData
            let data = UIImageJPEGRepresentation(image, 0.5)
 //这里为先前的写法,在Swift中路径有变化
 //--------------------------------------------------//           
            **//图片保存的路径
            //这里将图片放在沙盒的documents文件夹中
            let DocumentsPath:String = NSHomeDirectory().stringByAppendingString("Documents")
            //文件管理器
            let fileManager = NSFileManager.defaultManager()
            //把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png
            try! fileManager.createDirectoryAtPath(DocumentsPath, withIntermediateDirectories: true, attributes: nil)
            fileManager.createFileAtPath(DocumentsPath + "/image.png", contents: data, attributes: nil)
            //得到选择后沙盒中图片的完整路径
            let filePath = DocumentsPath + "/image.png"**
//--------------------------------------------------//
            //图片保存的路径
            //这里将图片放在沙盒的documents文件夹中
            //Home目录
            let homeDirectory = NSHomeDirectory()
            let documentPath = homeDirectory + "/Documents"
            //文件管理器
            let fileManager: NSFileManager = NSFileManager.defaultManager()
            //把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png
            do {
                try fileManager.createDirectoryAtPath(documentPath, withIntermediateDirectories: true, attributes: nil)
            }
            catch let error {
            }
            fileManager.createFileAtPath(documentPath.stringByAppendingString("/image.png"), contents: data, attributes: nil)
            //得到选择后沙盒中图片的完整路径
            let filePath: String = String(format: "%@%@", documentPath, "/image.png")
            print("filePath:" + filePath)
            Alamofire.upload(.POST, "http://192.168.3.16:9060/client/updateHeadUrl", multipartFormData: { multipartFormData in
                let lastData = NSData(contentsOfFile: filePath)
                multipartFormData.appendBodyPart(data: lastData!, name: "image")
                }, encodingCompletion: { response in
                    picker.dismissViewControllerAnimated(true, completion: nil)
                    switch response {
                    case .Success(let upload, _, _):
                        upload.responseJSON(completionHandler: { (response) in
                            print(response)
                            self.imageView.image = UIImage(data: data!)
                        })
                    case .Failure(let encodingError):
                        print(encodingError)
                    }
            })
        }
    }

3.你会发现有时候上传的图片是旋转了90度的,下面来修正照片位置:

func fixOrientation(aImage: UIImage) -> UIImage {
        // No-op if the orientation is already correct
        if aImage.imageOrientation == .Up {
            return aImage
        }
        // We need to calculate the proper transformation to make the image upright.
        // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
        var transform: CGAffineTransform = CGAffineTransformIdentity
        switch aImage.imageOrientation {
        case .Down, .DownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
        case .Left, .LeftMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0)
            transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))
        case .Right, .RightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, aImage.size.height)
            transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))
        default:
            break
        }
        switch aImage.imageOrientation {
        case .UpMirrored, .DownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
        case .LeftMirrored, .RightMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.height, 0)
            transform = CGAffineTransformScale(transform, -1, 1)
        default:
            break
        }
        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        //这里需要注意下CGImageGetBitmapInfo,它的类型是Int32的,CGImageGetBitmapInfo(aImage.CGImage).rawValue,这样写才不会报错
        let ctx: CGContextRef = CGBitmapContextCreate(nil, Int(aImage.size.width), Int(aImage.size.height), CGImageGetBitsPerComponent(aImage.CGImage), 0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage).rawValue)!
        CGContextConcatCTM(ctx, transform)
        switch aImage.imageOrientation {
        case .Left, .LeftMirrored, .Right, .RightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.height, aImage.size.width), aImage.CGImage)
        default:
            CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.width, aImage.size.height), aImage.CGImage)
        }
        // And now we just create a new UIImage from the drawing context
        let cgimg: CGImageRef = CGBitmapContextCreateImage(ctx)!
        let img: UIImage = UIImage(CGImage: cgimg)
        return img
    }

以上方法亲测无误,需要的小伙伴放入正确的地址来进行测试。

Demo下载地址:https://github.com/codeliu6572/Swift_upload_headerImage

目录
相关文章
|
算法
【MATLAB】数据拟合第12期-基于高斯核回归的拟合算法
【MATLAB】数据拟合第12期-基于高斯核回归的拟合算法
496 0
|
Docker 容器
Docker-配置连接多个镜像仓库
  之前介绍了如何使用docker连接私有镜像仓库,最近碰到一个问题,需要使用多个不同的镜像仓库,具体做法如下: 如果有按照我之前那一篇操作对【/usr/lib/systemd/system/docker.service】文件做了修改的话,需要先还原。
4625 0
深海探索:水下无人机与潜水器的最新进展
【9月更文挑战第20天】随着科技进步,深海探索迎来变革,水下无人机(UUV)与载人潜水器成为关键工具,不断突破技术壁垒,拓宽深海认知。UUV实现高自主性和智能化,如美国海军的“虎鲸”XLUUV及“蓑鲉”SUUV展现了多样化应用前景。载人潜水器如中国“蛟龙号”完成多次深潜任务,在西太平洋取得重要科学发现,并促进国际合作。未来,更先进的设备将助力深海研究、资源勘探及保护。
|
8月前
|
JavaScript 前端开发 Linux
flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈
flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈
307 18
学生0元购|低配也能畅玩!《黑神话:悟空》云电脑攻略
《黑神话:悟空》正式上市,这款备受期待的游戏对电脑配置要求不低,但通过云电脑,你无需担心硬件限制,随时随地畅玩大作。最低仅需1.2元/小时,还能利用学生福利免费畅玩。快速上手教程与省钱攻略,助你轻松征服《黑神话:悟空》!
676 8
学生0元购|低配也能畅玩!《黑神话:悟空》云电脑攻略
|
人工智能 Java API
Java中的智能语音识别与处理技术实践
Java中的智能语音识别与处理技术实践
|
Java 对象存储
【工具类】使用阿里oss实现图片、视频、文档上传
【工具类】使用阿里oss实现图片、视频、文档上传
949 0
|
11月前
|
JSON JavaScript 前端开发
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
深入解析ESLint配置:从入门到精通的全方位指南,精细调优你的代码质量保障工具
397 0
|
JSON 安全 Swift
【Swift开发专栏】Swift中的JSON解析与处理
【4月更文挑战第30天】本文介绍了Swift中的JSON解析与处理。首先,讲解了JSON的基础,包括其键值对格式和在Swift中的解析与序列化方法。接着,展示了如何使用`Codable`协议简化JSON操作,以及处理复杂结构的示例。通过这些内容,读者能掌握在Swift中高效地处理JSON数据的方法。
411 0
|
Web App开发 应用服务中间件 网络安全
HTTPS证书到期更换
HTTPS证书到期更换
2804 0