Swift-一步步教你上传头像 & swift利用Alamofire上传图片

Swift-一步步教你上传头像

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

上一篇中列出了Alamofire中GET和POST的使用方法,这里来介绍如何用Alamofire以表单形式来上传头像。
前面写过一篇Object-C的上传头像,这里代码是一样的,只是语言不一样,想看的请点击这里:http://blog.csdn.net/codingfire/article/details/51781194
下面来看看用Swift怎么来上传头像:

20160718165454746.gif

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

原文链接:http://blog.csdn.net/codingfire/article/details/51943286

补充:

swift利用Alamofire上传图片

后台的接口数据如下:
接口名称 上传头像
接口地址 /data/upload
传入参数 MultipartFile file, String phoneId, Integer phoneType
传出结果 //0 ok, 1 空文件, 2 文件写失败

分析: 接口需要传三个参数,file为图片的二进制文件,String类型的phoneId,Integer类型的phoneType

Alamofire上传图片,用于传递参数的类是multipartFormData,利用multipartFormData.appendBodyPart添加参数即可,内部会自动出来参数

private func upload(uploadImage: UIImage,address: String,scale: Double) {

        Alamofire.upload(.POST, address, multipartFormData: { (multipartFormData) in
            
                let data = UIImageJPEGRepresentation(uploadImage, scale)
                let imageName = String(NSDate()) + ".png"

            //multipartFormData.appendBodyPart(data: ,name: ,fileName: ,mimeType: )这里把图片转为二进制,作为第一个参数
            multipartFormData.appendBodyPart(data: data!, name: "file", fileName: imageName, mimeType: "image/png")
            
            //把剩下的两个参数作为字典,利用 multipartFormData.appendBodyPart(data: name: )添加参数,
            //因为这个方法的第一个参数接收的是NSData类型,所以要利用 NSUTF8StringEncoding 把字符串转为NSData 
            let param = ["phoneId" : HCUserModel.sharedInstance.phoneId!, "phoneType" : "1"]

           //遍历字典
           for (key, value) in param {
           multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
            }
            
        }) { (encodingResult) in
            switch encodingResult {
            case .Success(let upload, _, _):
                upload.responseJSON(completionHandler: { (response) in
                    if let myJson = response.result.value {
                        
                        if myJson as! NSObject == 0 {
                         print("上传成功")                            
                        }else {
                            print("上传失败")
                        }
                    }
                })
            case .Failure(let error):
                print(error)
            }
        }
    }

原文链接:http://blog.csdn.net/aa31140105/article/details/51893318

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,434评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 花是一种美丽的语言,弥漫在空气的凝香和色彩的鲜艳,足以让你觉得所有动与静的万物都那么美好,是的,我喜欢花,...
    小尘埃的大梦想阅读 404评论 3 3
  • 收到好友发来的微信总是欣喜的,半年都没有联系,在学生时代来说,这算是个比较长的时间。 并没有什么要紧的话,无非是几...
    SOLA布丁阅读 236评论 0 0
  • 上班族职场中要学会这些“避雷”措施 文/宁国涛 职场中,作为员工和下属,谁也避免不了挨领导的批评甚至受领导的训斥,...
    宁让职场更给力阅读 4,280评论 80 79