티스토리 뷰

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

postman_screenshot

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을 사용했다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함