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

标签 php ios xcode swift http-post

我正在尝试通过 HTTP POST 将带有文本消息的图像上传到 php 服务器,但发送的消息到达服务器时为空

@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)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData("Content-Disposition:form-data; name=\"test\"\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
    body.appendData("hi\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)



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


    body.appendData("--\(boundary)--\r\n".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
}

另外,如果我想做同样的事情来同时发送图像、视频和短信,我如何才能在选择视频路径后通过 HTTP POST 将其上传到服务器?

最佳答案

对所有类型的请求使用Alamofire框架。其简单且易于实现

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)
            }
    })

关于php - 在 swift 中使用 HTTP POST 发送文本和图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38052046/

相关文章:

PHP - 循环两列,一次一列

iphone - 在ios中以相同的顺序解析来自服务器的JSON响应

sql - Xcode iOS 电话目录应用程序。核心数据、sqlite 或

php - 如果条件为空,则 SQL WHERE 子句返回 ALL

php - 无法在新服务器上执行 Ajax 查询

php - IMAP 已安装但无法工作?

ios - 在运行时从静态 UITableView 中删除行

ios - 'NSInvalidArgumentException',原因:'-[__ NSMallocBlock__ size]:无法识别的选择器已发送到实例0x2098a5c0'

ios - 找不到 Xcode 文件

ios - 正在释放 :completion blocks? 可接受的对象