通过HTTPS帖子发送图像



我正在尝试发送图像(使用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

最新更新