如何在iOS中将图像数据上传到服务器?

时间:2017-06-12 09:09:48

标签: ios swift3

我想使用swift将我的图像数据存储在iOS服务器上。我尝试了下面的代码,但它不起作用,我必须做什么改变?

想要上传6张图片。this is my controller view, after clicking save it want to store at server

func myImageUploadRequest()
{

    let myUrl = NSURL(string: "http://easemyshop.in/upload_test/new.php");
    //let myUrl = NSURL(string: "http://easemyshop.in/upload_test/new.php");

    let request = NSMutableURLRequest(url:myUrl! as URL);
    request.httpMethod = "POST";

    let param = [


        "tag"  : "all",
        "count"    : "1",
        "shopname"    : "MayurShop",
        "partyName"    : "Paras",
        "cur_date"    : "14-06-2017",
        "due_date"    : "20-06-2017",
        "karagir"    : "Santra",
        "remark"    : "Urgent",
        "order_status"    : "Order Reccived"

    /*
        "firstName"  : "Mayur",
        "lastName"    : "Shinde",
        "userId"    : "101"

        */
    ]

    let boundary = generateBoundaryString()

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


    let imageData = UIImageJPEGRepresentation((imageView?.image!)!, 1)

    if(imageData==nil)  { return; }

    request.httpBody = createBodyWithParameters(parameters: param, filePathKey: "file", imageDataKey: imageData! as NSData, boundary: boundary) as Data

    myActivityIndicator.isHidden = false
    myActivityIndicator.startAnimating();

    let task = URLSession.shared.dataTask(with: request as URLRequest)
    {
        data, response, error in

        if error != nil
        {
            print("******** error=\(error)")
            return
        }

        // You can print out response object
        print("\n\n******* response *******\n\n")
        print("\(response!)")
    print("\n\n**************************\n\n")

        // Print out reponse body
        let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)

        print("\n\n****** response data *******\n\n")
        print("\(responseString!)")
        print("\n\n**************************\n\n")

        do
        {
            let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary

            print("\n\n*************\n\n")
            print(json!)
            print("\n\n*************\n\n")

            DispatchQueue.main.async(execute: {
                self.myActivityIndicator.stopAnimating()
                self.myActivityIndicator.isHidden = true
                //self.imageView?.image = nil;
            });

        }
        catch
        {
            print("\n\n*************ERROR******** => \(error)\n\n")
        }

    }

    task.resume()
}


func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
    let body = NSMutableData();

    if parameters != nil {
        for (key, value) in parameters! {
            body.appendString(string: "--\(boundary)\r\n")
            body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.appendString(string: "\(value)\r\n")
        }
    }

    let filename = "user-profile.jpg"
    let mimetype = "image/jpg"

    body.appendString(string: "--\(boundary)\r\n")
    body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
    body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n")
    body.append(imageDataKey as Data)
    body.appendString(string: "\r\n")



    body.appendString(string: "--\(boundary)--\r\n")

    return body
}



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

2 个答案:

答案 0 :(得分:2)

请尝试使用以下代码在服务器上上传图片,并将 fileName 变量值替换为您要将图片文件发送到服务器的值。

func uploadImage(urlString:String,headers:[String:String]?,params:[String:String]?,image:UIImage?){
    let boundary: String = "------VohpleBoundary4QuqLuM1cE5lMwCy"
    let contentType: String = "multipart/form-data; boundary=\(boundary)"

    let request = NSMutableURLRequest()
    request.url = URL(string: urlString)
    if let tHeaders = headers {
        for (key, value) in tHeaders {
            request.setValue(value, forHTTPHeaderField: key)
        }
    }
    request.httpShouldHandleCookies = false
    request.timeoutInterval = 60
    request.httpMethod = "POST"
    request.setValue(contentType, forHTTPHeaderField: "Content-Type")

    let body = NSMutableData()
    if let parameters = params {
        for (key, value) in parameters {
            body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
            body.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n".data(using: String.Encoding.utf8)!)
            body.append("\(value)\r\n".data(using: String.Encoding.utf8)!)
        }
    }
    //which field you have to sent image on server
    let fileName: String = "file"
    if image != nil {
        body.append("--\(boundary)\r\n".data(using: String.Encoding.utf8)!)
        body.append("Content-Disposition: form-data; name=\"\(fileName)\"; filename=\"image.png\"\r\n".data(using: String.Encoding.utf8)!)
        body.append("Content-Type:image/png\r\n\r\n".data(using: String.Encoding.utf8)!)
        body.append(UIImagePNGRepresentation(image!)!)
        body.append("\r\n".data(using: String.Encoding.utf8)!)
    }
    body.append("--\(boundary)--\r\n".data(using: String.Encoding.utf8)!)
    request.httpBody = body as Data
    let session = URLSession.shared
    let task = session.dataTask(with: request as URLRequest) { (data, response, error) in
        if(error != nil){
            print(String(data: data!, encoding: .utf8) ?? "No response from server")
        }
    }
    task.resume()
}

在您的PHP服务器上,您可以获得这样的文件名

<?php
   echo $_FILES['file']['name'];
?>

答案 1 :(得分:1)

encodeWithCoder

请尝试......