我正在尝试发送图像(使用uiimagePickerController从用户中获取),将其发送到正在寻找物理文件的API。jpeg或png都会做...使用此代码...如何格式化以发送?
我的帖子功能...帖子弦中的"(图像变量)"应该是图像文件...
var request = URLRequest(url: URL(string: "web address.php")!)
request.httpMethod = "POST"
let postString = "action=setDefendentData&username=("(userNameString!)")&datetime=(localDate)&latitude=(latitude!)&longitude=(longitude!)&image=(image variable)"
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
OperationQueue.main.addOperation{
loginAlertPopup(title: "Error", message: "Invalid Source: Check Internet Connection")
}
// check for fundamental networking error
print("error=(error)")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is (httpStatus.statusCode)")
print("response = (response)")
}
let responseString = String(data: data, encoding: .utf8)
if responseString! == "success" {
print("Good")
// Success Alert \
self.presentAlert(title: "Success", message: "Check-In has been updated!")
}
if responseString! == "fail" {
print("failed sending image")
print("Post String: (postString)")
// Alert Error \
OperationQueue.main.addOperation{
self.presentAlert(title: "Error", message: "Failed Sending Data")
}
}
}
task.resume()
}
这是我使用uiimagePickerController保存图像的代码:
let fileDirectory : NSURL = {
return try! FileManager.default.url(for: .documentDirectory , in: .userDomainMask , appropriateFor: nil, create: true)
}() as NSURL
let imageQuality: CGFloat = 0.5
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
// Saves to App Data
let imagePath = fileDirectory.appendingPathComponent("uploadImage.jpg")
guard let imageData = UIImageJPEGRepresentation(image, imageQuality) else {
// handle failed conversion
presentAlert(title: "Error", message: "Image Failure")
print("jpg error")
return
}
try! imageData.write(to: imagePath!)
print("Image Path: (imagePath!)")
print("Image Size: (imageData)")
//Get Image
let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
if let dirPath = documentPath.first{
let imageURL = URL(fileURLWithPath: dirPath).appendingPathComponent("uploadImage.jpg")
let newImage = UIImage(contentsOfFile: imageURL.path)
我尝试通过image
变量发送(在这种情况下为newImage
),但它不接受。IVE在我的视图控制器上创建了一个临时UIImageView以显示newImage
,并相应地更新... API处理程序只是不接受它。
有任何信息/帮助吗?
您无法通过将图像变量放在该帖子字符串中上传
上传 let postString = "action=setDefendentData&username=("(userNameString!)")&datetime=(localDate)&latitude=(latitude!)&longitude=(longitude!)&image=(image variable)"
request.httpBody = postString.data(using: .utf8)
相反,您的帖子URL应该像这样:
yourUrlDomain/action=setDefendentData&username=("(userNameString!)")&datetime=(localDate)&latitude=(latitude!)&longitude=(longitude!)
您必须发布附加到HTTPBody的图像数据。
NSMutableData *body = [NSMutableData data];
// Add __VIEWSTATE
[body appendData:[[NSString stringWithFormat:@"--%@rn", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Disposition: form-data; name="__VIEWSTATE"rnrn" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"/wEPDwUKLTQwMjY2MDA0M2RkXtxyHItfb0ALigfUBOEHb/mYssynfUoTDJNZt/K8pDs=" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"rn"] dataUsingEncoding:NSUTF8StringEncoding]];
// add image data
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
if (imageData) {
NSString *imageName = @"Any name you want";
NSString *contentDisposition = [NSString stringWithFormat:@"Content-Disposition: form-data; name="imagefile"; filename="%@"rn",imageName];
[body appendData:[[NSString stringWithFormat:@"--%@rn", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[contentDisposition dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpegrnrn" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:imageData];
[body appendData:[[NSString stringWithFormat:@"rn"] dataUsingEncoding:NSUTF8StringEncoding]];
}
[body appendData:[[NSString stringWithFormat:@"--%@--rn", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
不幸的是,我为我的Objective-C iOS应用程序制作了此代码,但我对Swift的经验不太经验。但是你得到图片。
Use Alamofire for image upload -
func makePostRequestForUploadingImage(_ service : String!, imageData : Data?, responseCallBack : APIClientResponseCallBack!) {
let urlString = self.urlStringWithService(service)
Alamofire.upload(multipartFormData: { (multipartFormData) in
if let _ = imageData {
multipartFormData.append(imageData!, withName: "", fileName: "", mimeType: "image/jpg")
}
}, to: urlString) { (encodingresult) in
switch encodingresult {
case .success(let upload, _, _):
upload.responseJSON { response in
responseCallBack? (response.response?.statusCode,response.result.value as AnyObject? , response.result.error as NSError?)
}
case .failure(let encodingError):
print(encodingError)
}
}
}
static func createBodyForMultiPart(input:Any, previousString:String,multipartFormData: MultipartFormData) {
print("previousString -- ", previousString)
if let dic = input as? [String:Any] {
for key in dic.keys {
self.createBodyForMultiPart(input: dic[key]!, previousString: previousString != "" ? (previousString + "[(key)]") : "(key)",multipartFormData: multipartFormData)
}
}
else if let array = input as? [Any] {
for i in 0..<array.count{
self.createBodyForMultiPart(input: array[i], previousString: previousString + "[(i)]",multipartFormData: multipartFormData)
}
}
else if let number = input as? Int {
multipartFormData.append(String(number).data(using:String.Encoding.utf8,allowLossyConversion:false )!, withName: previousString)
}
else if let text = input as? String{
multipartFormData.append(text.data(using:String.Encoding.utf8,allowLossyConversion :false)!, withName: previousString)
}
else if let image = input as? UIImage {
multipartFormData.append(UIImageJPEGRepresentation(image, 0.2)!, withName: previousString, fileName: "inspectionitem.jpeg", mimeType: "image/jpg")
}
else if let floatNumber = input as? Float {
multipartFormData.append(String(floatNumber).data(using:String.Encoding.utf8,allowLossyConversion :false)!, withName: previousString)
}
}
设置您的参数,包括您需要在参数中上传的图像dict