swift3.0 从相册选取或者拍照上传图片至阿里云OSS

导入相应的库
import Photos
import AliyunOSSiOS

选取照片需要继承 UIImagePickerControllerDelegate,UINavigationControllerDelegate

class TestViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{
    
}

在info.plist中添加相关配置如下

<!-- 相册 -->   
<key>NSPhotoLibraryUsageDescription</key>   
<string>App需要您的同意,才能访问相册</string>   
<!-- 相机 -->   
<key>NSCameraUsageDescription</key>   
<string>App需要您的同意,才能访问相机</string>  

从相册选择图片

 func selectPicture() {
        
        if UIImagePickerController.isSourceTypeAvailable(.photoLibrary){
            let picker = UIImagePickerController()
            picker.delegate = self
            picker.sourceType = UIImagePickerControllerSourceType.photoLibrary
            self.present(picker, animated: true, completion: {
                () -> Void in
            })
        }else{
            print("error")
        }
   }

拍照图片选取

func camera() {
        
        if UIImagePickerController.isSourceTypeAvailable(.camera){
            let picker = UIImagePickerController()
            picker.delegate = self
            picker.sourceType = UIImagePickerControllerSourceType.camera
            self.present(picker, animated: true, completion: { () -> Void in
            })
        }else{
            print("error")
        }
        
    }

拍照与相册选取会进入同一个回调中,如下所示

func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String :Any]){
        
        let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage,
            type:String = (info[UIImagePickerControllerMediaType]as!String)
        
        let fileManager = FileManager.default
        let rootPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                                           .userDomainMask, true)[0] as String
        
        let date = NSDate(),
            timeInterval = date.timeIntervalSince1970 * 1000

        //将图片保存在本地
        let filePath = "\(rootPath)/" + String(timeInterval) + ".png"
        let imageData = UIImageJPEGRepresentation(pickedImage, 1.0)
        fileManager.createFile(atPath: filePath, contents: imageData, attributes: nil)
        
        //上传
        uploadPic(url: URL.init(fileURLWithPath: filePath))
        
        if type == "public.image" {
            //关闭选择框
            picker.dismiss(animated:true, completion:nil)
        }
        
    }

  

初始化上传配置相关信息(通过StsToken回调管理token信息) 我是通过Alamofire获取数据

//初始化上传设置
    func initClient() {
        
        //上传配置设置
        let conf = OSSClientConfiguration()
        conf.maxRetryCount = 2
        conf.timeoutIntervalForRequest = 300
        conf.timeoutIntervalForResource = TimeInterval(24 * 60 * 60)
        conf.maxConcurrentRequestCount = 50
        
        //实现获取StsToken回调
        let credential2:OSSCredentialProvider = OSSFederationCredentialProvider.init(federationTokenGetter: { () -> OSSFederationToken? in
            
            let tcs = OSSTaskCompletionSource<AnyObject>.init()
            
            Alamofire.request("获取相关配置的接口地址", method: .get, parameters: [: ])
                .responseJSON { (response) in
                    
                    if let value = response.result.value {
                        
                        let json = JSON(value)
                        
                        if json["code"] == 1{
                            tcs.setResult(json as AnyObject?)
                        }else{
                            tcs.setError("error" as! Error)
                        }
                    }
            }
            
            tcs.task.waitUntilFinished()
            
            if tcs.task.error != nil {
                return nil
            }else {
                
                let jsonData:JSON = JSON(tcs.task.result as AnyObject),
                tokenInfo:OSSFederationToken = OSSFederationToken()
                
                tokenInfo.tAccessKey = "通过返回的jsonData自行赋值"
                tokenInfo.tSecretKey = "通过返回的jsonData自行赋值"
                tokenInfo.tToken = "通过返回的jsonData自行赋值"
                tokenInfo.expirationTimeInGMTFormat = "通过返回的jsonData自行赋值"
                
                return tokenInfo
            }
            
        })
        
        //实例化
        ossClient = OSSClient(endpoint: EndPoint, credentialProvider: credential2, clientConfiguration: conf)        
    }

上传方法为(在上传之前先调用initClient):

    //上传图片
    func uploadPic(url: URL) {
        
        let ossPutObj: OSSPutObjectRequest = OSSPutObjectRequest()
        //key为上传到阿里云的路径
        let  key = "image/" + md5String(str: String(describing: url)) + ".jpg"
        
        ossPutObj.bucketName = BucketName
        ossPutObj.objectKey = key
        ossPutObj.uploadingFileURL = url
        
        ossPutObj.uploadProgress = { (bytesSent, totalBytesSent, totalBytesExpectedToSend) -> Void in
            print(String(bytesSent) + "/" + String(totalBytesSent) + "/" + String(totalBytesExpectedToSend))
        }
        
        let uploadTask = ossClient?.putObject(ossPutObj)
        
        uploadTask?.continue({ (uploadTask) -> Any? in
            
            if let _err = uploadTask.error {
                print(_err)
            } else {
                if (uploadTask.result as? OSSPutObjectResult) != nil {
                     //上传成功后预览地址自行拼接     
                }
            }
            return uploadTask
        })
        
    }

  

"https://oss-cn-hangzhou.aliyuncs.com"

 

 

  

, UINavigationControllerDelegate

转载于:https://www.cnblogs.com/kunH/p/6765156.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将图片上传至阿里云OSS并存入MySQL可以分为以下几个步骤: 1. 添加阿里云OSS依赖 ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> ``` 2. 配置阿里云OSS参数 ```java @Configuration public class OSSConfig { @Value("${spring.aliyun.oss.access-key-id}") private String accessKeyId; @Value("${spring.aliyun.oss.access-key-secret}") private String accessKeySecret; @Value("${spring.aliyun.oss.endpoint}") private String endpoint; @Value("${spring.aliyun.oss.bucket-name}") private String bucketName; @Bean public OSSClient ossClient() { return new OSSClient(endpoint, accessKeyId, accessKeySecret); } @Bean public OSSProperties ossProperties() { return new OSSProperties(accessKeyId, accessKeySecret, endpoint, bucketName); } } ``` 3. 编写上传图片的服务类 ```java @Service public class ImageService { private final OSSClient ossClient; private final OSSProperties ossProperties; @Autowired public ImageService(OSSClient ossClient, OSSProperties ossProperties) { this.ossClient = ossClient; this.ossProperties = ossProperties; } public String uploadImage(MultipartFile file) throws Exception { String filename = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); String key = UUID.randomUUID().toString() + "-" + filename; ossClient.putObject(ossProperties.getBucketName(), key, inputStream); return key; } } ``` 4. 将上传的图片信息存入MySQL ```java @Service public class ImageInfoService { private final ImageInfoRepository imageInfoRepository; @Autowired public ImageInfoService(ImageInfoRepository imageInfoRepository) { this.imageInfoRepository = imageInfoRepository; } public void saveImageInfo(String filename, String key) { ImageInfo imageInfo = new ImageInfo(); imageInfo.setFilename(filename); imageInfo.setKey(key); imageInfoRepository.save(imageInfo); } } ``` 5. 控制器中调用上传图片的服务类和存入MySQL的服务类 ```java @RestController @RequestMapping("/image") public class ImageController { private final ImageService imageService; private final ImageInfoService imageInfoService; @Autowired public ImageController(ImageService imageService, ImageInfoService imageInfoService) { this.imageService = imageService; this.imageInfoService = imageInfoService; } @PostMapping("/upload") public Result uploadImage(@RequestParam("file") MultipartFile file) { try { String key = imageService.uploadImage(file); imageInfoService.saveImageInfo(file.getOriginalFilename(), key); return Result.success("上传成功"); } catch (Exception e) { e.printStackTrace(); return Result.error("上传失败"); } } } ``` 以上就是将图片上传至阿里云OSS并存入MySQL的实现过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值