IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> [Swift]Alamofire使用put方式上传图片到阿里云 -> 正文阅读

[游戏开发][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
    }
    
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:35:02  更:2022-04-15 00:35:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 20:55:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码