2015-04-12 48 views
3

我已閱讀了許多帖子並觀看了一些視頻。將base64編碼的圖像字符串POST到PHP

問題:我不能發佈一個base64字符串圖像PHP服務器並保存到MySQL數據庫沒有損壞。

我已經嘗試什麼:我已經嘗試通過編碼的圖像的字符串,就像我會通過一個字符串或INT作爲POST參數以base64。我驗證了POST數據已成功地將其發送到PHP服務器,並且它正在保存在數據庫中。但是,當我提取base64編碼的字符串並將其解碼以便可以在瀏覽器中呈現圖像時,它不起作用。它只顯示一個破碎的圖像鏈接,而不是圖像。看起來好像有什麼事情在POST過程中破壞數據。我這樣說是因爲我直接從Xcode中的println()語句複製了base64字符串,並將其粘貼到PHP文件中,並將其解碼並完美顯示。我能夠從我的Android應用程序上傳base64字符串完美無瑕。這些問題似乎與我在Swift中的做法有關。

經過一番研究,我看到我可能需要指定的圖像參數周圍的邊界。我對此不太肯定,因爲我不確定當你直接發送圖像文件時是否需要指定邊界,或者發送圖像的base64編碼字符串時是否也需要邊界。

誰能告訴我,如果我需要它發送到PHP服務器之前設置圍繞編碼字符串參數的base64的邊界?任何想法我可能做錯了什麼?

let image: UIImage = imgProfilePic.image! 

    let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.1, 0.1)) 
    let hasAlpha = false 
    let scale: CGFloat = 0.0 // Automatically use scale factor of main screen 

    UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale) 
    image.drawInRect(CGRect(origin: CGPointZero, size: size)) 

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    var imageData = UIImageJPEGRepresentation(scaledImage, 0.9) 
    let base64String = imageData.base64EncodedStringWithOptions(.allZeros) 

    var cd = CoreDataUser(pstrContext: "this") 

    var params = "strUsername=" + cd.getUsername() 
    params = params + "&strPassword=" + cd.getPassword() 
    params = params + "&blbProfilePic=" + base64String 
+0

編碼字符串可能包括'+'字符,它被替換爲PHP空白字符一個base64 。 – findall

+0

有沒有辦法防止這種情況發生? – play2win

+1

百分比編碼。 – Rob

回答

1

早些時候,我提到你https://stackoverflow.com/a/14803292/1271826其示出了一個相當有限和戰術解決+字符的在基極 - 64串的存在。這包括用%2B替換+字符。

但我注意到,你也是在你的參數,包括用戶名和密碼。這表明你真的想要一個更廣義的解決方案,百分比轉義所有的保留字符。如果你不這樣做,如果密碼包含保留字符(例如+&),則這將不起作用。

當提交參數這樣,你應該%的躲避值。例如,您可以定義~一個字符集是隻有「毫無保留」的字符(由RFC 3986定義),即字母數字字符加-._,和:

extension NSCharacterSet { 
    class func URLQueryValueAllowedCharacterSet() -> NSCharacterSet { 
     return NSCharacterSet(charactersInString: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-._~") 
    } 
} 

然後,你可以做是這樣的:

func percentEscapeString(string: String) -> String { 
    return string.stringByAddingPercentEncodingWithAllowedCharacters(.URLQueryValueAllowedCharacterSet())! 
} 

或者,如果你喜歡老CFURLCreateStringByAddingPercentEscapes功能,你可以這樣做:

func percentEscapeString(string: String) -> String { 
    return CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
     string, 
     nil, 
     ":/[email protected]!$&'()*+,;=", 
     CFStringBuiltInEncodings.UTF8.rawValue) as! String; 
} 

前面的例子更直觀,但後一種方法更有效一些。

但不管你如何實現它,你現在可以使用此功能%的逃避你的字符串:

let params = "strUsername=" + percentEscapeString(cd.getUsername()) + 
    "&strPassword=" + percentEscapeString(cd.getPassword()) + 
    "&blbProfilePic=" + percentEscapeString(base64String)