将图像从iOS / Swift上传到PHP服务器

时间:2016-06-22 04:02:42

标签: php ios swift post image-uploading

我已经查找了这个问题的其他解决方案,但我并不完全明白他们在做什么,而且我不能让我的工作。

这是我的快速代码

let imageData = UIImageJPEGRepresentation(image, 1.0)
if(imageData == nil ) { return }

let request = NSMutableURLRequest(URL: NSURL(string: ip)!) //ip is a string variable holding my correct ip address
request.HTTPMethod = "POST"
request.setValue("Keep-Alive", forHTTPHeaderField: "Connection")
let postString = "id=\(id)&"

let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: NSOperationQueue.mainQueue())

let body = NSMutableData()
body.appendData(postString.dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(imageData!)

request.HTTPBody = body


let task = session.uploadTaskWithRequest(request, fromData: imageData!)
task.resume()

这是我的PHP文件

<?php
if (move_uploaded_file($_FILES['file']['tmp_name'], "image.jpg")) {
  echo "File uploaded: ".$_FILES["file"]["name"];   
}
else {
  echo "File not uploaded";
}
?> 

我对位于我服务器前面的“image.jpg”文件有有效的读写权限,但它仍然会说它无法上传文件。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您作为POST请求正文的一部分提交图像。使用$_FILES无法访问它。

您可以Base-64 encode图片数据,发送帖子字符串"id=\(id)&image=\(base64EncodedImageData)",然后使用$_POST检索并解码。

您可能需要考虑使用Alamofire等网络库。

答案 1 :(得分:0)

手动和不推荐的方式:更改PHP代码以生成JSON响应。

echo json_encode(array("success"    => true,
                   "filename"   => basename($_FILES['image']['name']));

但如前所述,你应该让Alamofire为你做这件事。您可以使用MSProgress在Alamofire中进行可视化进度更新。

enter image description here

let apiToken = "ABCDE"
Alamofire.upload(
    .POST,
    "http://sample.com/api/upload",
    multipartFormData: { multipartFormData in
        multipartFormData.appendBodyPart(data: imageData, name: "yourParamName", fileName: "imageFileName.jpg", mimeType: "image/jpeg")
        multipartFormData.appendBodyPart(data: apiToken.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"api_token")
        multipartFormData.appendBodyPart(data: otherBodyParamValue.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!, name :"otherBodyParamName")
    },
    encodingCompletion: { encodingResult in
        switch encodingResult {
        case .Success(let upload, _, _):
            upload.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in
                print("Uploading Avatar \(totalBytesWritten) / \(totalBytesExpectedToWrite)")
                dispatch_async(dispatch_get_main_queue(),{
                    /**
                    *  Update UI Thread about the progress
                    */
                })
            }
            upload.responseJSON { (JSON) in
                dispatch_async(dispatch_get_main_queue(),{
                    //Show Alert in UI
                    print("Avatar uploaded");
                })
            }

        case .Failure(let encodingError):
            //Show Alert in UI
            print("Avatar uploaded");
        }
    }
);