티스토리 뷰
form-data 형태로 file 키 값에 파일을 첨부하여 업로드하는 함수를 작성할 것이다.
Postman에서 설정하면 다음과 같은 상태가 된다.

URLSession 설정 방법
func upload(_ data: Data, to url: URL) {
var request = URLRequest(url: url)
request.httpMethod = "POST"
// 고유한 Boundary 생성, Body의 시작과 끝을 알리는데 사용되며
// 내부 데이터와 혼동될 수 있어 고유한 값을 넣어주는 것이 일반적이다.
let boundary = UUID().uuidString
// form-data로 Body를 전송할 것을 알린다.
request.setValue(
"multipart/form-data; boundary=\(boundary)",
forHTTPHeaderField: "Content-Type"
)
// Key와 Value를 넣어 Body를 생성한다.
let httpBody = makeFormData(
key: "file",
filename: "image.png",
mimeType: "image/png",
value: data,
boundary: boundary
)
URLSession.shared.uploadTask(
with: request,
from: httpBody
) { data, response, error in
// 업로드 응답 처리
}
.resume()
}
Data와 업로드 URL을 받아 업로드하는 함수이다. 위 코드에선 파일명(filename)과 MIME 타입(mimeType)은 하드코딩 하였으나 실전에선 필요에 따라 변경할 수 있게 작성하자.
쿠키 설정
request.addValue("SID=\(token)", forHTTPHeaderField: "Cookie")
업로드에 로그인 정보나 추가적인 쿠키가 필요하다면 URL Request에 해당 값을 첨부한다.
Body 설정
func makeFormData(
key: String,
filename: String,
mimeType: String,
value: Data,
boundary: String
) -> Data {
var data = Data()
data.appendString("--\(boundary)\r\n")
data.appendString(
"Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(filename)\"\r\n"
)
data.appendString("Content-Type: \(mimeType)\r\n\r\n")
data.append(value)
data.appendString("\r\n")
data.appendString("--\(boundary)-\r\n")
return data
}
위 코드는 form-data Body를 생성해준다. HTTP Body에 Data 형태로 첨부한다.
extension Data {
mutating func appendString(_ string: String) {
if let data = string.data(using: .utf8) {
self.append(data)
}
}
}
필수는 아니지만 Data에 String을 쉽게 추가하기 위한 Extension을 사용했다.
'가이드' 카테고리의 다른 글
| SwiftUI에서 구글로그인 띄우기 (0) | 2022.07.30 |
|---|---|
| SwiftUI 프로젝트에서 커스텀 Scheme 또는 파일 연결 처리하기 (0) | 2022.04.13 |
| SwiftUI 커스텀 바인딩 활용하기 (0) | 2022.04.13 |
| SwiftUI fileImporter 파일선택기 사용하기 (UIDocumentPicker) (0) | 2022.04.12 |
| 그림으로 알아보는 핀터레스트 스타일 Collection View 만들기 (Swift) (0) | 2022.03.28 |
