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
반응형
'프로그래밍 > iOS' 카테고리의 다른 글
[Apple] 던스 번호(D-U-N-S Number) 받기 (0) | 2020.07.03 |
---|---|
[Xcode] console - [Process] kill() returned unexpected error 1 (0) | 2020.01.30 |
[XCode] Cocoapod Build Error (0) | 2019.12.20 |
[XCode 11] iOS 13 다크모드 해제 (0) | 2019.12.09 |
Swift 4 UIAlertController (0) | 2019.03.05 |