EEYatHo 앱 깎는 이야기

multipart/form-data 본문

iOS, Swift

multipart/form-data

EEYatHo 2021. 12. 13. 16:27
반응형

여러 데이터를 body에 담아 보낼 수 있는 기특한 Content-Type인 multipart/form-data

 

해당 데이터를 작성하고, 파싱 하는데에는 아래와 같은 특별한 규칙이 있다

--바운더리
데이터1에 필요한 헤더들

데이터1
--바운더리
데이터2에 필요한 헤더들

데이터2
--바운더리--

1. 바운더리는 데이터와 겹치지 않도록 특수한 string값으로 정하고,

2. 모든 바운더리 앞에 "--"를 붙힌다.

3. 마지막 바운더리는 뒤에도 "--"를 붙힌다.

 

* 특이한점은, 바운더리만으로 데이터 영역을 구분하는 줄 알았는데, 줄바꿈까지 똑같은 형태로 해야한다는 점이다...

무슨 줄바꿈까지.. ㅋㅋ.. 덕분에 3시간 날렸네ㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔㅔ

 

아래는 swift에서의 예시...

// 리퀘 생성
var request = URLRequest(url: requestUrl, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)

// 리퀘 메소드
request.httpMethod = "POST"

// 리퀘 헤드
let boundary = "Boundary_\(UUID().uuidString)"
request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

// 리퀘 바디
let content1 = "content1"
let content2 = "content2"
let content3 = "content3"

let fileName = "testFileName"
guard let imageData = UIImage(named: "testImage").jpegData(compressionQuality: 0.8) else {
    return
}

var data = Data()

data.append("--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"key1\"\r\n\r\n".data(using: .utf8)!)
data.append(key1.data(using: .utf8)!)

data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"key2\"\r\n\r\n".data(using: .utf8)!)
data.append(key3.data(using: .utf8)!)

data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"key3\"\r\n\r\n".data(using: .utf8)!)
data.append(key3.data(using: .utf8)!)

data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
data.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileName).jpg\"\r\n".data(using: .utf8)!)
data.append("Content-Type: image/jpg\r\n\r\n".data(using: .utf8)!)
data.append(imageData)

data.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)
request.httpBody = data
Comments