wake-ios/wake/View/Components/Upload/ImageUploadService.swift
2025-08-19 20:36:00 +08:00

167 lines
6.2 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Foundation
import UIKit
///
public class ImageUploadService {
// MARK: - Shared Instance
public static let shared = ImageUploadService()
// MARK: - Properties
private let uploader: ImageUploaderGetID
// MARK: - Initialization
public init(uploader: ImageUploaderGetID = ImageUploaderGetID()) {
self.uploader = uploader
}
// MARK: - Public Methods
///
/// - Parameters:
/// - image:
/// - progressHandler: (0.0 1.0)
/// - completion:
public func uploadImage(
_ image: UIImage,
progress progressHandler: @escaping (ImageUploadService.UploadProgress) -> Void,
completion: @escaping (Result<ImageUploaderGetID.UploadResult, Error>) -> Void
) {
uploader.uploadImage(
image,
progress: { progress in
let progressInfo = ImageUploadService.UploadProgress(
current: Int(progress * 100),
total: 100,
progress: progress,
isOriginal: true
)
DispatchQueue.main.async {
progressHandler(progressInfo)
}
},
completion: { result in
DispatchQueue.main.async {
completion(result)
}
}
)
}
///
/// - Parameters:
/// - image:
/// - compressionQuality: (0.0 1.0)
/// - progressHandler: (0.0 1.0)
/// - completion:
public func uploadCompressedImage(
_ image: UIImage,
compressionQuality: CGFloat = 0.5,
progress progressHandler: @escaping (ImageUploadService.UploadProgress) -> Void,
completion: @escaping (Result<ImageUploaderGetID.UploadResult, Error>) -> Void
) {
guard let compressedImage = image.jpegData(compressionQuality: compressionQuality).flatMap(UIImage.init(data:)) else {
completion(.failure(NSError(domain: "com.wake.upload", code: -1, userInfo: [NSLocalizedDescriptionKey: "图片压缩失败"])))
return
}
uploadImage(
compressedImage,
progress: progressHandler,
completion: completion
)
}
///
/// - Parameters:
/// - image:
/// - compressionQuality: (0.0 1.0)
/// - progressHandler:
/// - completion:
public func uploadOriginalAndCompressedImage(
_ image: UIImage,
compressionQuality: CGFloat = 0.5,
progress progressHandler: @escaping (ImageUploadService.UploadProgress) -> Void,
completion: @escaping (Result<ImageUploadService.UploadResults, Error>) -> Void
) {
//
uploadImage(image, progress: { progress in
let originalProgress = ImageUploadService.UploadProgress(
current: Int(progress.progress * 100),
total: 200, // 200100 + 100
progress: progress.progress * 0.5, // 50%
isOriginal: true
)
progressHandler(originalProgress)
}) { [weak self] originalResult in
guard let self = self else { return }
switch originalResult {
case .success(let originalUploadResult):
//
self.uploadCompressedImage(
image,
compressionQuality: compressionQuality,
progress: { progress in
let compressedProgress = ImageUploadService.UploadProgress(
current: 100 + Int(progress.progress * 100), // 100
total: 200, // 200100 + 100
progress: 0.5 + (progress.progress * 0.5), // 50%
isOriginal: false
)
progressHandler(compressedProgress)
},
completion: { compressedResult in
switch compressedResult {
case .success(let compressedUploadResult):
let results = ImageUploadService.UploadResults(
original: originalUploadResult,
compressed: compressedUploadResult
)
completion(.success(results))
case .failure(let error):
completion(.failure(error))
}
}
)
case .failure(let error):
completion(.failure(error))
}
}
}
// MARK: - Supporting Types
///
public struct UploadProgress {
public let current: Int
public let total: Int
public let progress: Double
public let isOriginal: Bool
public init(current: Int, total: Int, progress: Double, isOriginal: Bool) {
self.current = current
self.total = total
self.progress = progress
self.isOriginal = isOriginal
}
}
///
public struct UploadResults {
public let original: ImageUploaderGetID.UploadResult
public let compressed: ImageUploaderGetID.UploadResult
public init(original: ImageUploaderGetID.UploadResult,
compressed: ImageUploaderGetID.UploadResult) {
self.original = original
self.compressed = compressed
}
}
}