我试图将图像上传为多部分表单数据,但我从服务器收到状态代码404的错误。任何人都可以指出我在做这个错误吗?
服务器接受“文件”作为我们上传的图像的关键。
这是我到目前为止所尝试的...
public func UPLOADING(url: String,parameters: Dictionary<String,AnyObject>?,filename:String,image:UIImage, success:((NSDictionary) -> Void)!, failed:((NSDictionary) -> Void)!, errord:((NSError) -> Void)!) {
let TWITTERFON_FORM_BOUNDARY:String = "AaB03x"
let url = NSURL(string: url)!
let request:NSMutableURLRequest = NSMutableURLRequest(url: url as URL, cachePolicy: NSURLRequest.CachePolicy.reloadIgnoringCacheData, timeoutInterval: 10)
let MPboundary:String = "--\(TWITTERFON_FORM_BOUNDARY)"
let endMPboundary:String = "\(MPboundary)--"
//convert UIImage to NSData
let data:NSData = UIImagePNGRepresentation(image)! as NSData
let body:NSMutableString = NSMutableString();
// with other params
if parameters != nil {
for (key, value) in parameters! {
body.appendFormat("\(MPboundary)\r\n" as NSString)
body.appendFormat("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n" as NSString)
body.appendFormat("\(value)\r\n" as NSString)
}
}
// set upload image, name is the key of image
body.appendFormat("%@\r\n",MPboundary)
body.appendFormat("Content-Disposition: form-data; file=\"\(filename)\"\"\r\n" as NSString)
body.appendFormat("Content-Type: image/png\r\n\r\n")
let end:String = "\r\n\(endMPboundary)"
let myRequestData:NSMutableData = NSMutableData();
myRequestData.append(body.data(using: String.Encoding.utf8.rawValue)!)
myRequestData.append(data as Data)
myRequestData.append(end.data(using: String.Encoding.utf8)!)
let content:String = "multipart/form-data; boundary=\(TWITTERFON_FORM_BOUNDARY)"
request.setValue(content, forHTTPHeaderField: "Content-Type")
request.setValue("\(myRequestData.length)", forHTTPHeaderField: "Content-Length")
request.httpBody = myRequestData as Data
request.httpMethod = "POST"
let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {
data, response, error in
if error != nil {
print(error!)
errord(error! as NSError)
return
}
print(response ?? "")
do {
let responseObject:[String:Any]? = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? [String:Any]
if let responseDictionary = responseObject as NSDictionary? {
success(responseDictionary)
} else {
}
} catch let error as NSError {
print(error.localizedDescription)
}
})
task.resume()
}
在viewDidload中,
let image = UIImage(named: "ed1.png",
in: Bundle(for: type(of: self)),
compatibleWith: nil)
UPLOADING(url: "url-of-site", parameters: nil, filename: "ed1.png", image: image!, success: { (sucDict) in
print(sucDict)
}, failed: { (failedDict) in
print(failedDict)
}) { (error) in
print(error.description)
}
我看到几个问题,主要是次要的:
但没有一个合理地解释404错误。只有在脚本本身的路径错误时才应该发出。这可能是由某些微妙的原因引起的,例如iOS更喜欢通过IPv4上的IPv6地址访问服务器,并且Web服务器的IPv6端可能配置错误。或者它可能是错误的URL。无论哪种方式,调试的唯一方法是深入了解服务器日志并查看它尝试读取的文件,然后找出该文件不存在的原因。