티스토리 뷰

일반적인 Parameter 만 보낼때는 몰랐지만

이미지를 보내는 건 좀 다르게 생겼습니다. 

 

이거는 좀 특이해서 전체 코드를 올리는게 좋을것같아서 

전체 코드로 올려드립니다.

 

Alamofire에 대한 기본적인 이해는 이전 글을 참고해주세요.

2022.12.29 - [iOS개발/Swift 통신] - Swift Alamofire 세부 설정편

 

기본적으로 이미지를 그냥 보내는게 아니라 Data 타입으로 바꿔서 보낸다고 생각하시면 됩니다. 

 

사용법 (참고해주세요.)

let imageData = image.jpegData(compressionQuality: 1.0)
let fileName = "answer_image"

// 같이 보낼 parameter(Parameter)는 기존과 동일하게 설정해주세요. 
// sendUrl 도 마찬가지로 원하시는 URL을 입력해주세요.

NetWorkBase.sendFileData(a_url: sendUrl, fileName: fileName, fileData: imageData!, a_param: parameter){response in
    print(response)
}

함수식 (저는 NetWorkBase 라는 class 안에 아래 함수를 선언해서 사용하기때문에 위처럼 사용하는 겁니다.)

//MARK: 파일전송은 따로 제작
    public static func sendFileData(a_url: String,fileName: String,fileData: Data,a_param: [String : Any?], completionHandler: @escaping (_ response: [String: Any]) -> ()) {
        // Header 는 서버에 맞게 설정해주세요.
        let apiHeader: HTTPHeaders = [ "Content-Type" : "multipart/form-data"]
        let totalUrl = TEST_URL + a_url
        
        AF.upload(multipartFormData: { multiPart in
            for (key, value) in a_param {
                if let temp = value as? String {
                    multiPart.append(temp.data(using: .utf8)!, withName: key)
                }
                if let temp = value as? Int {
                    multiPart.append("\(temp)".data(using: .utf8)!, withName: key)
                }
                if let temp = value as? NSArray {
                    temp.forEach({ element in
                        let keyObj = key + "[]"
                        if let string = element as? String {
                            multiPart.append(string.data(using: .utf8)!, withName: keyObj)
                        } else
                        if let num = element as? Int {
                            let value = "\(num)"
                            multiPart.append(value.data(using: .utf8)!, withName: keyObj)
                        }
                    })
                }
            }
            multiPart.append(fileData, withName: "file", fileName: "\(fileName).jpg", mimeType: "image/jpeg")
           
        }, to: totalUrl,method: .post,headers: apiHeader).responseData{ response in
            switch response.result {
            case .success(let data):
                do {
                    let value = try JSONSerialization.jsonObject(with: data , options: .mutableContainers)
                    print(value)
                    guard let castingValue = value as? [String: Any] else {return}
                    completionHandler(castingValue)
                }catch {
                    print(error)
                    print("get special error")
                }
            case .failure(let error):
                print(error.localizedDescription)
            }
        }.uploadProgress{progress in
            print("percent : \(progress.fractionCompleted)")
        }
              
    }

모양이 많이 달라진게 보이시나요? 

multipartFormData 를 이용해 Data파일을 보내다 보니 

기존 모양이랑은 많이 달라졌습니다. 

(기존에는 파라미터를 만들고 바로 보냈다면 여기는 다시 분해해서 일일이 추가해주는 방식?)

 

물론 이 방법이 최선인지는 좀더 알아보는 편이 좋겠지만 

저의 경우에는 한참을 해메다 이런 식으로 했습니다. 

 

저처럼 해메시는 분들을 위해 올려봅니다. 

* 참고로 이번 글은 다른 분들이 올리셨던 코드들을 참고해서 제작되었습니다.

 

그럼 오늘도 파이팅입니다.

댓글