[swift] Swift로 HTTP 요청에 파일 업로드하기

Swift를 사용하여 HTTP 요청을 보내고 파일을 업로드하는 것은 매우 간단한 일입니다. 이번 블로그에서는 URLSession을 사용하여 Swift에서 파일을 업로드하는 방법에 대해 알아보겠습니다.

1. 파일 선택

먼저, 업로드할 파일을 선택해야 합니다. 이 예제에서는 UIImagePickerController를 사용하여 사용자가 앨범에서 사진을 선택할 수 있도록 구성하겠습니다. 다음은 이미지 피커를 구성하는 코드입니다.

func pickImage() {
    let imagePicker = UIImagePickerController()
    imagePicker.sourceType = .photoLibrary
    imagePicker.delegate = self
    present(imagePicker, animated: true, completion: nil)
}

2. URLSession을 사용하여 파일 업로드

파일을 선택한 후, URLSession을 사용하여 파일을 업로드할 준비를 해야 합니다. 다음은 업로드할 파일을 서버에 전송하는 함수입니다.

func uploadFile(with fileURL: URL) {
    let requestURL = URL(string: "http://example.com/upload")!
    var request = URLRequest(url: requestURL)
    request.httpMethod = "POST"

    let data = try! Data(contentsOf: fileURL)
    
    let boundary = "Boundary-\(UUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    
    var body = Data()
    body.append("--\(boundary)\r\n".data(using: .utf8)!)
    body.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileURL.lastPathComponent)\"\r\n".data(using: .utf8)!)
    body.append("Content-Type: image/jpeg\r\n\r\n".data(using: .utf8)!)
    body.append(data)
    body.append("\r\n".data(using: .utf8)!)
    body.append("--\(boundary)--\r\n".data(using: .utf8)!)
    
    request.httpBody = body
    
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        // 업로드 완료 후 처리할 코드 추가
    }
    
    task.resume()
}

위의 코드에서는 파일을 업로드하기 위해 multipart/form-data 형식의 요청을 만듭니다. 파일 데이터는 Data(contentsOf: fileURL)를 통해 가져옵니다. 파일의 이름과 타입을 지정한 후 요청에 첨부합니다.

3. 파일 업로드 호출

이제 파일을 선택하고 업로드하는 작업을 호출하는 방법을 알아보겠습니다. 아래의 코드는 사용자가 이미지를 선택한 후에 uploadFile(with:) 함수를 호출하도록 구성하는 예제입니다.

extension YourViewController: UIImagePickerControllerDelegate & UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true, completion: nil)
        
        if let fileURL = info[.imageURL] as? URL {
            uploadFile(with: fileURL)
        }
    }
}

위의 코드에서 didFinishPickingMediaWithInfo 메소드는 사용자가 이미지를 선택한 후 호출됩니다. 선택한 파일의 URL을 가져와 uploadFile(with:) 함수를 호출하여 업로드를 수행합니다.

결론

이제 Swift에서 파일을 업로드하는 방법을 알았습니다. URLSession을 사용하여 파일을 업로드하는 것은 매우 간단하며, 위의 예제 코드를 사용하여 시작할 수 있습니다.