简述
在常规的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
}