728x90
반응형

 

앱에서 서버로 ImageData를 Base64 Encode 해서 보내는데 "+" 부분이 " " 으로 변환되는 이슈가 있습니다.

 

해당 HTTP 통신할 떄 발생합니다.

 

이런 문제를 해결하기 위한 간단한 2가지 방법을 알아보겠습니다.

 

 

 

 

1. 서버와 약속된 문자열로 변환

클라이언트에서 특정 문자를 Url Safe 한 문자로 변환을 하여 서버에게 전송하면 서버에서 다시 원상태로 문자를 변환하는 작업입니다.

 

아래는 Swift 코드 이지만 서버도 비슷하게 처리 하면 됩니다.

 

toggleBase64URLSafe(on: true) 했을때 서버로 요청하는 url로 변환하고 false 는 url을 원상태로 변환합니다.

    func toggleBase64URLSafe(on: Bool) -> String {
        if on {
            // Make base64 string safe for passing into URL query params
            let base64url = self.replacingOccurrences(of: "/", with: "_")
                .replacingOccurrences(of: "+", with: "-")
                .replacingOccurrences(of: "=", with: "")
            return base64url
        } else {
            // Return to base64 encoding
            var base64 = self.replacingOccurrences(of: "_", with: "/")
                .replacingOccurrences(of: "-", with: "+")
            // Add any necessary padding with `=`
            if base64.count % 4 != 0 {
                base64.append(String(repeating: "=", count: 4 - base64.count % 4))
            }
            return base64
        }
    }

 

 

 

 

2. 특정 문자를 URL Encoding 하기.

서버를 자회사에서 관리한다면 약속된 문자열로 변환해도 상관없지만 타회사에 요청하는 경우엔 약속을 할 수 없습니다.

 

간단하게 아래와같이 특정부분을 URL Encoding 해서 보내면 문제는 사라집니다.

 

아래 코드로 HTTP 통신을 한다면 "+" 문자가 " "로 변환되어 집니다.

import Foundation

extension UIImage {
    var base64String: String {
        let imageData: NSData = self.jpegData(compressionQuality: 0.1)! as NSData
        let base64url = imageData.base64EncodedString(options: [.endLineWithCarriageReturn, .endLineWithLineFeed])
        return base64url
    }
}

 

 

 

 

하지만 아래 코드처럼 특정 문자를 URL Encoding 해서 보내면 서버에서도 문제없이 처리가 됩니다.

 

toReplace함수는 replacingOccurrences(of: of, with: with) 와 동일합니다.

import Foundation

extension UIImage {
    var base64String: String {
        let imageData: NSData = self.jpegData(compressionQuality: 0.1)! as NSData
        let base64url = imageData.base64EncodedString(options: [.endLineWithCarriageReturn, .endLineWithLineFeed])
        return base64url.toReplace("+", "%2B")
    }
}

 

 

728x90
반응형

+ Recent posts