ios - 如何将 UIImage 转换为 .JPEG 格式并将其发送到服务器?
问题描述
我正在构建一个可以将.jpeg
文件发送到服务器的应用程序。所以我想做的是我有一个控制器来拍照并将照片发送到服务器。当然,第一个照片格式是 a UIImage
,当我将它发送到服务器时它不起作用,因为服务器不接受UIImage
文件类型。所以我做了一些研究,发现了转换UIImage
为.jpeg
文件格式的函数,如下所示:
let photoJpg = self.photo?.jpegData(compressionQuality: 1.0)
我将photoJpg
变量传递给 API 调用函数,但 API 一直拒绝我的请求,在调用 API 时说 500 状态代码。所以我猜我可能不会以正确的方式转换文件。那么如何将其转换UIImage
为.jpeg
文件格式,将其存储到变量中并将其发送到 API?如果您需要更多信息,请随时询问,我会提供给您。谢谢你。
编辑:调用 API 的函数
func submitPhoto() {
let headers = ["authorization": registerData!.token]
let photoJpg = self.photo?.jpegData(compressionQuality: 1.0)
let params: [String: Any] = [
"files": photoJpg!
]
Webservice.Request(url: Webservice.SUBMIT_PHOTO, method: Webservice.HttpMethod.post, parameters: params, headers: headers, loading: true, loadingString: nil, success: { (response) in
print("Submit photo success")
}) { (response) in
print("Submit photo failed")
}
}
Webservice类中的Request函数
class func Request(url: String, method: HttpMethod, parameters: [String: Any], headers: [String:String], loading: Bool, loadingString: String?, success: @escaping (JSON) -> Void, failure: @escaping (Error) -> Void) {
if manager == nil {
let urlConfig = URLSessionConfiguration.default
urlConfig.timeoutIntervalForRequest = KPMConfig.RTO_TIME
manager = SessionManager(configuration: urlConfig)
}
let request = manager.request(url, method: method == .post ? HTTPMethod.post : HTTPMethod.get, parameters: parameters, encoding: URLEncoding.default, headers: headers)
if loading {
ProgressHUD.show(loadingString, interaction: false)
}
print("-url: \n\(url)")
print("-params: \n\(parameters)")
print("-headers: \n\(headers)")
request.responseJSON { (response) in
if loading {
ProgressHUD.dismiss()
}
switch response.result {
case .success(let values):
let data = JSON(values)
print("response: \n\(data)")
switch data["code"].intValue {
case 200...203:
success(data)
case 400...403:
let errorDetails = Error(
error: ErrorModel(code: data["error"]["code"].stringValue,
message: data["error"]["message"].stringValue,
target: data["error"]["target"].stringValue,
details: data["error"]["details"]),
code: data["code"].intValue)
failure(errorDetails)
if data["code"].intValue == 401 {
print("-url: \n\(url)")
self.removeUserData()
self.goToLoginPage()
}
case 500:
let errorDetails = Error(
error: ErrorModel(code: data["error"]["code"].stringValue,
message: data["error"]["message"].stringValue,
target: data["error"]["target"].stringValue,
details: data["error"]["details"]),
code: data["code"].intValue)
failure(errorDetails)
default:
break
}
case .failure(let values):
let data = JSON(values)
print("-response: \n\(data)")
let errorDetails = Error(
error: ErrorModel(code: data["error"]["code"].stringValue,
message: data["error"]["message"].stringValue,
target: data["error"]["target"].stringValue,
details: data["error"]["details"]),
code: data["code"].intValue)
failure(errorDetails)
}
}
}
解决方案
您需要将图像保存在文档目录中然后您可以将 jpeg 文件发送到服务器,因为这是您需要做的。
func saveImageAndGetData(name: String, image: UIImage) -> Data? {
guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil}
let fileName = name
let fileURL = documentsDirectory.appendingPathComponent(fileName)
guard let data = image.jpegData(compressionQuality: 1) else { return nil}
//Checks if file exists, removes it if so.
if FileManager.default.fileExists(atPath: fileURL.path) {
do {
try FileManager.default.removeItem(atPath: fileURL.path)
print("Removed old image")
} catch let removeError {
print("couldn't remove file at path", removeError)
}
}
do {
try data.write(to: fileURL)
} catch let error {
print("error saving file with error", error)
}
return data
}
获取这样的数据
if let imageData = saveImageAndGetData(name: "name", image: UIImage(named: "image")!) {
}
加载图像
func loadImageFromDisk(fileName: String) -> UIImage? {
let documentDirectory = FileManager.SearchPathDirectory.documentDirectory
let userDomainMask = FileManager.SearchPathDomainMask.userDomainMask
let paths = NSSearchPathForDirectoriesInDomains(documentDirectory, userDomainMask, true)
if let dirPath = paths.first {
let imageUrl = URL(fileURLWithPath: dirPath).appendingPathComponent(fileName)
let image = UIImage(contentsOfFile: imageUrl.path)
return image
}
return nil
}
推荐阅读
- r - 使用 dplyr 改变一个新列,其值基于多个条件
- opencv - Flask OpenCV 将视频流发送到外部 HTML 页面
- visual-studio - 键入后 Visual Studio 崩溃
- r - R-以下错误:返回的 API:请求的身份验证范围不足
- javascript - Javascript:卡在两个皇后的对角线验证以及它们是否可以互相攻击
- vue.js - 如何从动态填充的选择框中侦听初始更改事件
- dhcp - LXD DHCP 分发 IP 地址
- arrays - 通过指针数组引用的结构
- python - 使用openCV从2行绘制和填充多边形
- python - 以相同的方式随机化 2 个 numpy 数组