doudao2954 2016-06-27 10:50
浏览 143

在swift中使用HTTP POST发送文本和图像

I'm trying to upload image with text message to php server through HTTP POST but the sent message is reached to server as null

@IBOutlet var image: UIImageView!
var CUSTOMER_KEY = "dkeqnq9fmkhq"
var msg = "The first msg"

override func viewDidLoad() {
    super.viewDidLoad()

}


@IBAction func selectVideo(sender: AnyObject) {

    var videoPickerController = UIImagePickerController()
    videoPickerController.delegate = self

    videoPickerController.sourceType = .SavedPhotosAlbum
    videoPickerController.mediaTypes =  [kUTTypeMovie as String]



    self.presentViewController(videoPickerController, animated: true, completion: nil)
}
@IBAction func selectPicture(sender: AnyObject) {

    let ImagePicker = UIImagePickerController()
    ImagePicker.delegate = self
    ImagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary

    self.presentViewController(ImagePicker, animated: true, completion: nil)


}



func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    image.image = info[UIImagePickerControllerOriginalImage] as? UIImage
    self.dismissViewControllerAnimated(true, completion: nil)
}



@IBAction func upload_request(sender: AnyObject) {
    UploadRequest()
}



func UploadRequest()
{
    let comURL = "myurlhere?customer_key=dkeqnq9fmkhq&msg=MSGHere"


    let sendURL:NSURL = NSURL(string: comURL.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)!




    let request = NSMutableURLRequest(URL: sendURL)

    request.HTTPMethod = "POST"



    let boundary = generateBoundaryString()


    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")


    if (image.image == nil)
    {
        return
    }

    let image_data = UIImagePNGRepresentation(image.image!)


    if(image_data == nil)
    {
        return
    }


    let body = NSMutableData()

    let newRandomName = randomStringWithLength(32)
    let fname = (newRandomName as String) + ".png"
    let mimetype = "image/png"



    print ("New File Name:" + (newRandomName as String))

    body.appendData("--\(boundary)
".dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData("Content-Disposition:form-data; name=\"test\"

".dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData("hi
".dataUsingEncoding(NSUTF8StringEncoding)!)



    body.appendData("--\(boundary)
".dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData("Content-Disposition:form-data; name=\"file\"; filename=\"\(fname)\"
".dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData("Content-Type: \(mimetype)

".dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData(image_data!)
    body.appendData("
".dataUsingEncoding(NSUTF8StringEncoding)!)


    body.appendData("--\(boundary)--
".dataUsingEncoding(NSUTF8StringEncoding)!)



    request.HTTPBody = body



    let session = NSURLSession.sharedSession()


    let task = session.dataTaskWithRequest(request) {
        (
        let data, let response, let error) in

        guard let _:NSData = data, let _:NSURLResponse = response  where error == nil else {
            print("error")
            return
        }

        let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)

        print(dataString)

    }

    task.resume()


}


func generateBoundaryString() -> String
{
    return "Boundary-\(NSUUID().UUIDString)"
}

func randomStringWithLength (len : Int) -> NSString {

    let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

    var randomString : NSMutableString = NSMutableString(capacity: len)

    for (var i=0; i < len; i++){
        var length = UInt32 (letters.length)
        var rand = arc4random_uniform(length)
        randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
    }

    return randomString
}

Also If i want to make the same thing to send image, video and text message at the same time how I can do that to take video path after selected it and upload it to server through HTTP POST?

  • 写回答

3条回答 默认 最新

  • douzhouqin6223 2016-06-27 10:56
    关注

    Use Alamofire framework for all types of request. Its simple and easy to implement

    Alamofire.upload(.POST, requestURL, headers: nil, multipartFormData: { multipartFormData in
    
            if image != nil
            {
                if let imageData = UIImageJPEGRepresentation(image!, 1)
                {
                    multipartFormData.appendBodyPart(data: imageData, name: "file", fileName: "profile.jpg", mimeType: "image/jpeg")
                }
            }
    
            for (key, value) in params
            {
                multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
            }
            },
    
            encodingMemoryThreshold: Manager.MultipartFormDataEncodingMemoryThreshold,
            encodingCompletion: { encodingResult in
                switch encodingResult {
                case .Success(let upload, _, _):
                    upload.responseJSON { response in
                        success(response: response.result.value)
                    }
                case .Failure(let error):
                    failure(error: error)
                }
        })
    
    评论

报告相同问题?

悬赏问题

  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面