相册上传
选取相册
(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()
}
}
如果上传成功服务器将能看到图片