有思俱乐部学习园地

相册上传



选取相册

(1)Info.plist配置
由于苹果安全策略更新,在使用Xcode8开发时,需要在Info.plist配置请求照片相的关描述字段(Privacy - Photo Library Usage Description)
 
             //选取相册
import UIKit
import Foundation
import Alamofire //第三方库,用于post请求
import CryptoSwift //第三方库,用于加密
import SwiftyJSON   //第三方库,用于解析json

//UIImagePickerControllerDelegate 设备是否支持照相机/图片库/相册功能。UINavigationControllerDelegate  导航控制器 
//实现UIImagePickerControllerDelegate,UINavigationControllerDelegate两个代理。

class ViewController: UIViewController, UIImagePickerControllerDelegate,
UINavigationControllerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    //在界面添加个button按钮,点击按钮打开相册
    @IBOutlet var Butt: [UIButton]!

    //选取相册
    @IBAction func fromAlbum(_ sender: Any) {
        //判断设置是否支持图片库
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
            //初始化图片控制器
            let picker = UIImagePickerController()
            //设置代理
            picker.delegate = self
            //指定图片控制器类型
            picker.sourceType = .photoLibrary
            //弹出控制器,显示界面
            self.present(picker, animated: true, completion: {
                () -> Void in
            })
        }else{
            print("读取相册错误")
        }
    }
    
    //选择图片成功后代理
    func imagePickerController(_ picker: UIImagePickerController,
                               didFinishPickingMediaWithInfo info: [String : Any]) {
       
       
        //获取选择的原图
        let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        
        //将选择的图片保存到Document目录下
        let fileManager = FileManager.default
        //保存到沙盒,Document获取方式
        let rootPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                                           .userDomainMask, true)[0] as String
        
       
        //获取当前时间,以当前时间戳去命名图片
        let now = Date()
        let timeInterval:TimeInterval = now.timeIntervalSince1970
        let timeStamp = Int(timeInterval)
        //print("当前时间的时间戳:\(timeStamp)")
        var filePath = "\(rootPath)/\(timeStamp).jpg"
        
      
        //图片压缩
        var maxSize: Int = 1024
        
        
        var maxImageSize: Int = 1024
        
        var imageData = UIImageJPEGRepresentation(pickedImage, 1.0) //把图片转为data,初始图片大小
        
        var sizeOriginKB : Int = Int((imageData?.count)!) / 1024;   // sizeOriginKB 图片的大小
        
  
        //调整大小
       
        var resizeRate = 0.5  // 压缩比例
            
        while (sizeOriginKB > 480 && resizeRate > 0.1)
        {
                
            imageData = UIImageJPEGRepresentation(pickedImage,CGFloat(resizeRate));
                    
            sizeOriginKB = Int((imageData?.count)!) / 1024;
                    
            resizeRate -= 0.1
  
        }
        //以下定义常量是为图片切割所用
        //file_size 是图片imageData的长度, readMax 读取最大1024 , num 每次读取最大,分几次读取
        let file_size:Int = (imageData?.count)! 
        let readMax:Int = 1024 * 128
        let num:Int = (file_size+readMax-1) / readMax
        let tail_length:Int = file_size % readMax;
    
       
       //把imageDaga 转成 byte数组 
        let bytes:Array = [UInt8](imageData!)
       // print("原始字符串:\(bytes)")
        
        
        let file_bytes:[UInt8] = [UInt8](bytes)
        //print(file_bytes)
       
       
        
        fileManager.createFile(atPath: filePath, contents: imageData ,attributes: nil)
      
        
        //上传图片
        if (fileManager.fileExists(atPath: filePath)){
            //取得NSURL
            let imageURL = URL(fileURLWithPath: filePath)
            let pathString = imageURL.path
            
          
            let firstpost:[String : Any] = [
              //post的参数
            ]
            //使用Alamofire上传
         
            Alamofire.request("服务器地址", method: HTTPMethod.post,parameters: firstpost)
                .responseJSON{ response in
                    
                    print("Success: \(response.result.isSuccess)")
                    print("Response String: \(response.result.value ?? "")")
                   
                  
                        let value = response.result.value
                        //利用第三方库进行json解析
                        let json = JSON(value)
                        let name = json["想获取的解析值"].string
                        let token = json["想获取的解析值"].string
                    
                        self.imageCut(file_size: file_size, readMax: readMax, num: num, tail_length: tail_length, file_bytes: file_bytes, name: name!, token: token!)
                       
            
                   
                    
                   
                 
            }
           
        }
        
        //图片控制器退出
        picker.dismiss(animated: true, completion:nil)
    }
           //图片切片的函数
  
       
       


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

                
        

如果上传成功服务器将能看到图片