Skip to content

Commit c4e5c2f

Browse files
authored
Merge pull request #8 from stealmh/add-videoUpload
Add video upload
2 parents 02da36f + 51541e1 commit c4e5c2f

File tree

2 files changed

+71
-12
lines changed

2 files changed

+71
-12
lines changed

Sources/CuteNetwork/Cute.swift

Lines changed: 61 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,18 @@ open class Cute<EndPoint: EndPointType>: NSObject, NetworkRouter, URLSessionDele
8585
//MARK: - Cute + Upload
8686
extension Cute {
8787
/// - petitUpload(_ root: EndPoint, image: UIImage, fileName: String, imageType: String, petitLogVisible: Bool) async throws -> Data 함수를 래핑
88-
open func petitUpload<T: Decodable>(_ root: EndPoint, imageType: ImageInformation, petitLogVisible: Bool = true) async throws -> T {
88+
open func petitUpload<T: Decodable>(_ root: EndPoint,
89+
imageMultiPart: ImageInformation? = nil,
90+
videoMultiPart: VideoInformation? = nil,
91+
petitLogVisible: Bool = true) async throws -> T {
92+
guard imageMultiPart != nil || videoMultiPart != nil else {
93+
throw NetworkError.custom(message: "잘못된 접근")
94+
}
95+
8996
do {
9097
let result = try await petitUpload(root,
91-
imageType: imageType,
98+
imageMultiPart: imageMultiPart,
99+
videoMultiPart: videoMultiPart,
92100
petitLogVisible: petitLogVisible)
93101

94102
let decoder = JSONDecoder()
@@ -103,10 +111,19 @@ extension Cute {
103111
}
104112
}
105113
/// - petitUpload(_ route: EndPoint, image: UIImage, fileName: String, imageType: String, logAccess: Bool, completion: @escaping NetworkRouterCompletion) 함수를 래핑
106-
open func petitUpload(_ root: EndPoint, imageType: ImageInformation, petitLogVisible: Bool) async throws -> Data {
114+
open func petitUpload(_ root: EndPoint,
115+
imageMultiPart: ImageInformation? = nil,
116+
videoMultiPart: VideoInformation? = nil,
117+
petitLogVisible: Bool) async throws -> Data {
118+
guard imageMultiPart != nil || videoMultiPart != nil else {
119+
throw NetworkError.custom(message: "잘못된 접근")
120+
}
121+
122+
107123
return try await withCheckedThrowingContinuation({ value in
108124
petitUpload(root,
109-
imageType: imageType,
125+
imageMultiPart: imageMultiPart,
126+
videoMultiPart: videoMultiPart,
110127
logAccess: petitLogVisible) { data, response, error in
111128
if let error {
112129
value.resume(throwing: error as? NetworkError ?? NetworkError.custom(message: error.localizedDescription))
@@ -132,7 +149,17 @@ extension Cute {
132149
})
133150
}
134151
/// dataTask를 걸친 데이터 까지 넘겨주는 역할
135-
open func petitUpload(_ route: EndPoint, imageType: ImageInformation, logAccess: Bool, completion: @escaping NetworkRouterCompletion) {
152+
open func petitUpload(_ route: EndPoint,
153+
imageMultiPart: ImageInformation? = nil,
154+
videoMultiPart: VideoInformation? = nil,
155+
logAccess: Bool,
156+
completion: @escaping NetworkRouterCompletion) {
157+
158+
guard imageMultiPart != nil || videoMultiPart != nil else {
159+
completion(nil, nil, NetworkError.custom(message: "잘못된 접근"))
160+
return
161+
}
162+
136163
guard Reachability.isConnectedToNetwork() else {
137164
completion(nil, nil, NetworkError.noConnectionToInternet)
138165
return
@@ -149,10 +176,19 @@ extension Cute {
149176
do {
150177
let boundary = "Boundary-\(UUID().uuidString)"
151178
let request = try self.buildRequest(from: route, boundary: boundary)
152-
let multipartBody = createMultipartBody(boundary, imageType)
179+
let multipartBody: Data?
180+
if let imageMultiPart {
181+
multipartBody = createMultipartBody(boundary, imageMultiPart)
182+
} else {
183+
print("요기")
184+
multipartBody = createMultipartBody(boundary, videoMultiPart!)
185+
}
153186
if logAccess { NetworkLogger.log(request: request) }
154187

155-
task = session.uploadTask(with: request, from: multipartBody, completionHandler: { data, response, error in
188+
task = session.uploadTask(with: request, from: multipartBody!, completionHandler: { data, response, error in
189+
print(String(data: data!, encoding: .utf8))
190+
print(response)
191+
print(error)
156192
completion(data, response, error)
157193
})
158194

@@ -181,12 +217,27 @@ extension Cute {
181217
var uploadData = Data()
182218
if let data = imageType.image.jpegData(compressionQuality: 0.8) {
183219
uploadData.append(boundaryPrefix.data(using: .utf8)!)
184-
uploadData.append("Content-Disposition: form-data; name=\"img\"; filename=\"\(imageType.imageName).\(imageType)\"\r\n".data(using: .utf8)!)
185-
uploadData.append("Content-Type: image/\(imageType.imageType)\r\n\r\n".data(using: .utf8)!)
220+
uploadData.append("Content-Disposition: form-data; name=\"\(imageType.fieldName)\"; filename=\"\(imageType.fileName)\"\r\n".data(using: .utf8)!)
221+
uploadData.append("Content-Type: \(imageType.mimeType)\r\n\r\n".data(using: .utf8)!)
186222
uploadData.append(data)
187223
uploadData.append("\r\n".data(using: .utf8)!)
188224
uploadData.append("--\(boundary)--".data(using: .utf8)!)
189-
} // adjust compression quality as needed
225+
}
226+
return uploadData
227+
}
228+
229+
fileprivate func createMultipartBody(_ boundary: String, _ videoMultiPart: VideoInformation) -> Data {
230+
print(#function)
231+
let boundaryPrefix = "--\(boundary)\r\n"
232+
var uploadData = Data()
233+
if let data = try? Data(contentsOf: videoMultiPart.videoURL) {
234+
uploadData.append(boundaryPrefix.data(using: .utf8)!)
235+
uploadData.append("Content-Disposition: form-data; name=\"\(videoMultiPart.fieldName)\"; filename=\"\(videoMultiPart.fileName)\"\r\n".data(using: .utf8)!)
236+
uploadData.append("Content-Type: \(videoMultiPart.mimeType)\r\n\r\n".data(using: .utf8)!)
237+
uploadData.append(data)
238+
uploadData.append("\r\n".data(using: .utf8)!)
239+
uploadData.append("--\(boundary)--".data(using: .utf8)!)
240+
}
190241
return uploadData
191242
}
192243

Sources/CuteNetwork/ImageInformation.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,15 @@
88
import UIKit
99

1010
public struct ImageInformation {
11-
let imageName: String
12-
let imageType: String
11+
let fieldName: String
12+
let fileName: String
13+
let mimeType: String
1314
let image: UIImage
1415
}
16+
17+
public struct VideoInformation {
18+
let fieldName: String
19+
let fileName: String
20+
let mimeType: String
21+
let videoURL: URL
22+
}

0 commit comments

Comments
 (0)