基於Swift的iOS應用程序開發:以Base64字符串形式上傳文件——從iOS選擇文件並上傳

簡述

在常規的web開發過程中,大部分上傳文件都是在web頁面端通過表單直接提交,再由服務器端捕獲請求來進行處理的。但是在前後端分離趨於一種流行趨勢,再加上Android和iOS開發技術日漸成熟,大部分團隊都會選擇在服務器端僅提供一套通用的webservice數據接口,而web頁面、Android和iOS統一都通過這套數據接口來向服務器發送請求和獲取數據。
在這一過程中,大部分的webservice數據接口都會採用xml數據格式或是json數據格式來進行數據請求和處理,在這種情況下,其實來自客戶端的請求就可以看作是一個字符串(無論是xml還是json數據)。此時,常規的數據提交完全不存在任何問題,但是附件上傳就需要特殊處理了。

本文簡單介紹瞭如何在iOS中選擇本地文件,並向服務器發送上傳請求,以字符串的形式將文件上傳到服務器。

一、將文件轉換爲字符串

其實在iOS程序中,要將文件以字符串形式上傳到服務器,關鍵還是在於將文件轉換爲字符串,而至於向服務器發送請求,就和普通的post或是get請求沒有任何兩樣。

我們以上傳圖片爲例,因爲將手機拍攝的圖片或相冊中的圖片上傳是最爲常見的需求。
下面的方法直接能夠將圖片對象轉換爲base64字符串:
/**
 *  將一個圖片轉換爲base64的字符串
 */
func imageToString(image:UIImage) -> String{
    //根據圖片得到對應的二進制編碼
        
    //壓縮圖片質量,0.6代表將圖片質量壓縮爲原圖的60%
    guard let imageData = UIImageJPEGRepresentation(image, 0.6) else {
        return ""
    }
        
    //根據二進制編碼得到對應的base64字符串
    let base64String = imageData.base64EncodedString()

    return base64String

}
注意,我在這個方法裏並沒有去處理圖片的文件頭信息。如果有需要的話,我們可以用以下方式進行處理:
base64String = "data:image/jpg;base64," + base64String
其中的“data:image/jpg;base64,”就是文件頭信息,可以根據不同的文件類型自行進行變換。

二、將字符串轉換回文件

在某些情況下,如果我們需要將字符串重新轉換回文件的話,可以調用下面這個方法:
/**
 *  將一個base64字符串轉換爲圖片
 */
func base64StringToUIImage(base64String:String)->UIImage? {
    var str = base64String
        
    // 1、判斷用戶傳過來的base64的字符串是否是以data開頭的,如果是以data開頭的,那麼就獲取字符串中的base代碼,然後在轉換,如果不是以data開頭的,那麼就直接轉換
    if str.hasPrefix("data:image") {
        guard let newBase64String = str.components(separatedBy: ",").last else {
            return nil
        }
        str = newBase64String
    }
    // 2、將處理好的base64String代碼轉換成NSData
    guard let imgNSData = NSData(base64Encoded: str, options: NSData.Base64DecodingOptions()) else {
        return nil
    }
    // 3、將NSData的圖片,轉換成UIImage
    guard let codeImage = UIImage(data: imgNSData as Data) else {
        return nil
    }
    return codeImage
}

三、上傳文件

關於如何在iOS中向服務器端發起http請求,並傳送請求參數,可以參考下面的文章:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章