[Swift]Alamofire使用put方式上传图片到阿里云

项目中导入SwiftyJSON和Alamofire

pod ‘SwiftyJSON’, ‘4.0.0’
pod ‘Alamofire’, ‘4.9.0’

选择图片,获取上传路径列表

import UIKit

class UserInfoController: UIViewController {
    
    /// 选择头像
    private func selectHeadImage() {
        let imagePickerVC = TZImagePickerController(maxImagesCount: 1, delegate: self)
        imagePickerVC?.modalTransitionStyle = .flipHorizontal
        imagePickerVC?.modalPresentationStyle = .overCurrentContext
        imagePickerVC?.showSelectBtn = false
        imagePickerVC?.allowCrop = true
        imagePickerVC?.cropRect = CGRect(x: 0, y: (UIScreen.main.bounds.size.height - UIScreen.main.bounds.size.width)/2.0, w: UIScreen.main.bounds.size.width, h: UIScreen.main.bounds.size.width)
        imagePickerVC?.allowPickingVideo = false
        imagePickerVC?.allowPickingOriginalPhoto = false
        imagePickerVC?.didFinishPickingPhotosHandle = { [weak self] photo, assets, isSelectOriginalPhoto in
            guard let photo = photo, let this = self,photo.count != 0 else {return}
            let img = photo.first
            this.getUploadUrl([img])
        }
        self.presentVC(imagePickerVC!)
    }


    /**
     获取图片上传路径数组,根据contentType数组后端返回一个上传路径的数组
     HTTP Content-type 对照表:http://tools.jb51.net/table/http_content_type
     接口返回:
     {
         "message": null,
         "code": "00000",
         "data": ["https://cps-oss-prod.oss-cn-hangzhou.aliyuncs.com/cps/2022/04/13/16498338964949632?OSSAccessKeyId=LTAI5tJKUNiuZCSTyvTjAoAd&Expires=1649837586&Signature=n8J4a6%2BwVk2QXs7agUMzXrs979o%3D"]
     }
     */
    private func getUploadURL(_ imageArr: [UIImage]) {
        var typeArr: [String] = []
        for img in imageArr {
            if let data = img.jpegData(compressionQuality: 1) {
                let type = data.getImageFormat()
                if type == .JPEG {
                    typeArr.append("image/jpeg")
                } else if type == .PNG {
                    typeArr.append("image/png")
                }
            }
        }
            
        AlertHUD.show()
        var params: [String : Any] = [:]
        params["contentType"] = typeArr
        JRNetworkManager.shared.request(CommonAPI.uploadUrl(params), completed: { [weak self] (result) in
            AlertHUD.dismiss(withDelay: 0.1)
            guard let this = self else { return }
            if let pathArr = result.object as? [String] {
                this.imagesUpload(imageArr: imageArr, pathArr: pathArr, contentTypeArr: typeArr)
            }
        }, failed: { (status, error) in
            AlertHUD.showText(error)
        })
    }

    /// 图片上传
    private func imagesUpload(imageArr: [UIImage], pathArr: [String], contentTypeArr: [String]) {
        if imageArr.count == pathArr.count || imageArr.count == contentTypeArr.count {
            for (index, img) in imageArr.enumerated() {
                let path = pathArr[index]
                JRNetworkManager.shared.aliyunUploadImage(img, path, completed: { [weak self] (result) in
                    if let photoPath = path.components(separatedBy: "?").first {
                        self?.editAvatar(path: photoPath)
                    }
                }, failed: { (status, error)in
                    AlertHUD.showMsg("操作失败")
                })
            }
        }
    }
  
      /// 调用编辑头像接口
    private func editAvatar(path: String) {
        
    }

}

Alamofire使用put方式上传图片到阿里云

import Foundation
import Alamofire
import SwiftyJSON

enum NetworkStatus : String {
    case success = "00000"
    case networkError = "A0001"
    case otherError = "-1"
}

class JRNetworkManager: NSObject {
    
    static let shared = JRNetworkManager()
    typealias CompletedBlock = ((JSON) -> Void)
    typealias FailedBlock = ((NetworkStatus, String) -> Void)
  
      private override init() {
        super.init()
      }

    /// 上传图片
    func aliyunUploadImage(_ image: UIImage, _ url: String, completed: @escaping CompletedBlock, failed: @escaping FailedBlock) {
        if let imageData = image.jpegData(compressionQuality: 0.5) {
            let reURL = url
            let stream = InputStream(data: imageData)
            var uploadHeaders: HTTPHeaders = [:]
            uploadHeaders["Content-Type"] = "image/jpeg"
            do {
                let newurl = try reURL.asURL()
                upload(stream, to: newurl , method: .put,headers: uploadHeaders)
                let tempData = JSON(["url":url])
                completed(tempData)
            } catch {
                failed(.otherError, "上传失败")
            }
        } else {
            failed(.otherError, "上传失败")
        }
    }
    
}

根据Data获取文件的contentType

import Foundation

enum ImageFormat {
    case Unknow
    case JPEG
    case PNG
    case GIF
    case TIFF
    case WebP
    case HEIC
    case HEIF
}

extension Data {
    
    func getImageFormat() -> ImageFormat  {
        var buffer = [UInt8](repeating: 0, count: 1)
        self.copyBytes(to: &buffer, count: 1)
        
        switch buffer {
        case [0xFF]: return .JPEG
        case [0x89]: return .PNG
        case [0x47]: return .GIF
        case [0x49],[0x4D]: return .TIFF
        case [0x52] where self.count >= 12:
            if let str = String(data: self[0...11], encoding: .ascii), str.hasPrefix("RIFF"), str.hasSuffix("WEBP") {
                return .WebP
            }
        case [0x00] where self.count >= 12:
            if let str = String(data: self[8...11], encoding: .ascii) {
                let HEICBitMaps = Set(["heic", "heis", "heix", "hevc", "hevx"])
                if HEICBitMaps.contains(str) {
                    return .HEIC
                }
                let HEIFBitMaps = Set(["mif1", "msf1"])
                if HEIFBitMaps.contains(str) {
                    return .HEIF
                }
            }
        default: break;
        }
        return .Unknow
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值