feat: 素材上传成

This commit is contained in:
jinyaqiu 2025-08-19 18:53:17 +08:00
parent 13f458fff6
commit d0f0b09f8a

View File

@ -1,6 +1,7 @@
import SwiftUI
import PhotosUI
<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
// MARK: - Photo Picker
@ -165,6 +166,14 @@ class ImageUploader: ObservableObject {
=======
>>>>>>> a207b78 (feat: )
=======
///
struct UploadResults {
let original: ImageUploaderGetID.UploadResult
let compressed: ImageUploaderGetID.UploadResult
}
>>>>>>> 5611df8 (feat: )
///
/// 使UIViewControllerRepresentablePHPickerViewControllerSwiftUI
struct PhotoPicker: UIViewControllerRepresentable {
@ -189,8 +198,12 @@ struct PhotoPicker: UIViewControllerRepresentable {
private let uploader = ImageUploader()
=======
///
<<<<<<< HEAD
var onImageUploaded: ((Result<ImageUploaderGetID.UploadResult, Error>) -> Void)?
>>>>>>> a207b78 (feat: )
=======
var onImageUploaded: ((Result<UploadResults, Error>) -> Void)?
>>>>>>> 5611df8 (feat: )
// MARK: - Initialization
@ -208,7 +221,7 @@ struct PhotoPicker: UIViewControllerRepresentable {
selectedImages: Binding<[UIImage]>,
selectionLimit: Int = 1,
filter: PHPickerFilter = .images,
onImageUploaded: ((Result<ImageUploaderGetID.UploadResult, Error>) -> Void)? = nil
onImageUploaded: ((Result<UploadResults, Error>) -> Void)? = nil
) {
>>>>>>> a207b78 (feat: )
self._selectedImages = selectedImages
@ -269,14 +282,11 @@ struct PhotoPicker: UIViewControllerRepresentable {
}
///
/// - Parameters:
/// - picker:
/// - results:
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
//
parent.selectedImages.removeAll()
// 使DispatchGroup
// 使DispatchGroup
let group = DispatchGroup()
<<<<<<< HEAD
var loadedImages: [Int: UIImage] = [:]
@ -284,53 +294,97 @@ struct PhotoPicker: UIViewControllerRepresentable {
var lastError: Error?
=======
var loadedImages: [Int: UIImage] = [:] //
<<<<<<< HEAD
>>>>>>> a207b78 (feat: )
=======
var uploadResults: [Int: (original: ImageUploaderGetID.UploadResult?,
compressed: ImageUploaderGetID.UploadResult?)] = [:]
>>>>>>> 5611df8 (feat: )
//
for (index, result) in results.enumerated() {
group.enter() //
//
if result.itemProvider.canLoadObject(ofClass: UIImage.self) {
//
result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] (image, error) in
<<<<<<< HEAD
if let image = image as? UIImage {
<<<<<<< HEAD
=======
//
>>>>>>> a207b78 (feat: )
loadedImages[index] = image
=======
guard let self = self, let image = image as? UIImage else {
group.leave()
return
}
//
self?.uploader.uploadImage(image) { result in
// 线
DispatchQueue.main.async {
switch result {
case .success(let uploadResult):
print("✅ 上传成功fileId: \(uploadResult.fileId)")
print("📂 文件信息:")
print(" - 文件名: \(uploadResult.fileName)")
print(" - 文件大小: \(uploadResult.fileSize) 字节")
print(" - 文件URL: \(uploadResult.fileUrl)")
// 1.
loadedImages[index] = image
//
self?.parent.onImageUploaded?(.success(uploadResult))
// 2. 50%
guard let compressedImage = image.jpegData(compressionQuality: 0.5).flatMap(UIImage.init(data:)) else {
group.leave()
return
}
// 3.
self.uploader.uploadImage(image) { [weak self] originalResult in
guard let self = self else {
group.leave()
return
}
>>>>>>> 5611df8 (feat: )
switch originalResult {
case .success(let originalUploadResult):
// 4.
self.uploader.uploadImage(compressedImage) { compressedResult in
defer { group.leave() }
switch compressedResult {
case .success(let compressedUploadResult):
//
uploadResults[index] = (originalUploadResult, compressedUploadResult)
print("✅ 原图和压缩图上传成功!")
print("📂 原图信息:")
print(" - 文件ID: \(originalUploadResult.fileId)")
print(" - 文件大小: \(originalUploadResult.fileSize) 字节")
print("📦 压缩图信息:")
print(" - 文件ID: \(compressedUploadResult.fileId)")
print(" - 文件大小: \(compressedUploadResult.fileSize) 字节")
// 使MaterialService
MaterialService.shared.uploadMaterialInfo(
fileId: originalUploadResult.fileId,
previewFileId: compressedUploadResult.fileId
) { success, errorMessage in
if success {
print("✅ 文件信息上传成功 素材上传成功!!!!!")
} else if let errorMessage = errorMessage {
print("❌ 文件信息上传失败: \(errorMessage)")
}
}
case .failure(let error):
print("❌ 上传失败: \(error.localizedDescription)")
//
self?.parent.onImageUploaded?(.failure(error))
print("❌ 压缩图上传失败: \(error.localizedDescription)")
uploadResults[index] = (originalUploadResult, nil)
}
}
case .failure(let error):
print("❌ 原图上传失败: \(error.localizedDescription)")
group.leave()
}
}
group.leave() //
}
} else {
group.leave() //
group.leave()
}
}
<<<<<<< HEAD
//
group.notify(queue: .main) {
<<<<<<< HEAD
@ -351,6 +405,31 @@ struct PhotoPicker: UIViewControllerRepresentable {
//
>>>>>>> a207b78 (feat: )
=======
//
group.notify(queue: .main) { [weak self] in
guard let self = self else { return }
// 1.
let sortedImages = loadedImages.sorted { $0.key < $1.key }.map { $0.value }
self.parent.selectedImages.append(contentsOf: sortedImages)
// 2.
if let firstResult = uploadResults.first?.value,
let original = firstResult.original,
let compressed = firstResult.compressed {
// 3.
let results = UploadResults(original: original, compressed: compressed)
self.parent.onImageUploaded?(.success(results))
} else {
// 4.
self.parent.onImageUploaded?(.failure(NSError(domain: "com.wake.upload",
code: -1,
userInfo: [NSLocalizedDescriptionKey: "上传过程中出现错误"])))
}
// 5.
>>>>>>> 5611df8 (feat: )
picker.dismiss(animated: true)
}
}
@ -376,7 +455,7 @@ struct AvatarUploader: View {
var onUploadComplete: ((Result<ImageUploadService.UploadResults, Error>) -> Void)?
///
var onUploadComplete: ((Result<ImageUploaderGetID.UploadResult, Error>) -> Void)?
var onUploadComplete: ((Result<UploadResults, Error>) -> Void)?
// MARK: - State