基于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请求,并传送请求参数,可以参考下面的文章:

猜你喜欢

转载自blog.csdn.net/freezingxu/article/details/77936977