当试图用swift上传到api时,图像数据显示损坏或为零



我正在尝试将图像文件从我的应用程序上传到API以供学校使用。当它成功上传时,它只是被破坏了,无法预览,或者它说没有数据,只有1kb的数据。我想知道我的代码是否有问题。此外,我的弹簧板API说rtException:所需的请求部分"文件"不存在

func use(){

let semaphore = DispatchSemaphore (value: 0)
let parameters = [
[
"key": "file",
"src": "k.png",
"type": "file"
]] as [[String : Any]]
let boundary = "Boundary-(UUID().uuidString)"
var body = ""
var _: Error? = nil
for param in parameters {
if param["disabled"] == nil {
let paramName = param["key"]!
body += "--(boundary)rn"
body += "Content-Disposition:form-data; name="(paramName)""
if param["contentType"] != nil {
body += "rnContent-Type: (param["contentType"] as! String)"
}
let paramType = param["type"] as! String
if paramType == "text" {
let paramValue = param["value"] as! String
body += "rnrn(paramValue)rn"
} else {
let paramSrc = param["src"] as! String
let fileData = UIImage(data: self.picData)?.pngData()
let fileContent = String(data: fileData!, encoding: .utf16)
body += "; filename="(paramSrc)"rn"
+ "Content-Type: "content-type header"rnrn(String(describing: fileContent))rn"
}
}
}
body += "--(boundary)--rn";
let postData = body.data(using: .utf16)
var request = URLRequest(url: URL(string: "cant show my actual url for the project")!,timeoutInterval: Double.infinity)
request.addValue("multipart/form-data; boundary=(boundary)", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = postData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else {
print(String(describing: error))
semaphore.signal()
return
}
print(String(data: data, encoding: .utf8)!)
semaphore.signal()
}
task.resume()
semaphore.wait()

}

别想了,这是很多人犯的一个大错误,不是每个Data都可以用UTF8编码转换成字符串!这就是为什么:

let imageData = UIImage(data: self.picData)?.pngData()
let imageString = String(data: imageData, encoding: .utf8)

将输出一个imageStringnil,这很正常。

现在,body的类型应该是Data,并将其附加到Data

let boundaryString = "Boundary-(UUID().uuidString)"
let boundaryData = Data("--(boundaryString)rn".utf8)
var body = Data()
for param in parameters {
if param["disabled"] == nil {
let paramName = param["key"]!
body += boundaryData
body += Data("Content-Disposition:form-data; name="(paramName)"".utf8)
if param["contentType"] != nil {
body += Data("rnContent-Type: (param["contentType"] as! String)".utf8)
}
let paramType = param["type"] as! String
if paramType == "text" {
let paramValue = param["value"] as! String
body += Data("rnrn(paramValue)rn".utf8)
} else {
let paramSrc = param["src"] as! String
let fileData = UIImage(data: self.picData)?.pngData()
let fileContent = String(data: fileData!, encoding: .utf16)
body += Data("; filename="(paramSrc)"rn".utf8)
body += Data("Content-Type: "content-type header"rn".utf8)
body += Data("rn".utf8)
body += fileData
body += Data("rn".utf8)
}
}
}
body += boundaryData
let postData = body

现在,有了正确的展开:即停止使用!:

let boundaryString = "Boundary-(UUID().uuidString)"
let boundaryData = Data("--(boundaryString)rn".utf8)
var body = Data()
for param in parameters {
if param["disabled"] == nil, let name = param["key"] as? String {
body += boundaryData
body += Data("Content-Disposition:form-data; name="(name)"".utf8)
if let contentType = param["contentType"] as? String {
body += Data("rnContent-Type: (contentType)".utf8)
}
if let paramType = param["type"] as? String, 
paramType == "text", 
let value = param["value"] as? String {
body += Data("rnrn(value)rn".utf8)
} else if let source = param["src"] as? String, let fileData = UIImage(data: self.picData)?.pngData() {
let fileContent = String(data: fileData, encoding: .utf16)
body += Data("; filename="(source)"rn".utf8)
body += Data("Content-Type: "content-type header"rn".utf8)
body += Data("rn".utf8)
body += fileData
body += Data("rn".utf8)
}
}
}
body += boundaryData
let postData = body

最新更新