簡體   English   中英

將圖像上傳到服務器 - Swift 3

[英]Upload image to server - Swift 3

我想將圖像作為參數與我的請求一起發送。 我使用下面的代碼來調用我的 POST 請求,但我不知道如何將圖像附加到正文。

我通過圖像選擇器獲取圖像如下:

if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {

我的請求形成如下

var request = URLRequest(url: URL(string: "")!) // link removed
        request.httpMethod = "POST"
        let postString = "user_id=\(userId)&image=\(image)"
        request.httpBody = postString.data(using:.utf8)

        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {               // check for fundamental networking error
                return
            }
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? AnyObject

                if let parseJSON = json {
                    print("resp :\(parseJSON)")
                }
            } catch let error as NSError {
                print("error : \(error)")
            }
        }
        task.resume()

我是斯威夫特的新手。 我已經通過 multipart/form-data 看到了這一點,但無法自己實現。 我不想以 base 64 格式對其進行編碼。 請幫助我。

我使用以下結構發送圖像:

func createRequestBodyWith(parameters:[String:NSObject], filePathKey:String, boundary:String) -> NSData {
    
    let body = NSMutableData()

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

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

    let mimetype = "image/jpg"

    let defFileName = "yourImageName.jpg"
        
    let imageData = UIImageJPEGRepresentation(yourImage, 1)

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

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

    return body
}



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



extension NSMutableData {
    func appendString(string: String) {
        let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
        append(data!)
    }
}

那么你必須在你的函數中創建主體,如下所示:

request.httpBody = self.createRequestBodyWith(parameters:yourParamsDictionary, filePathKey:yourKey, boundary:self.generateBoundaryString)

斯威夫特 4.2

func uploadImage(paramName: String, fileName: String, image: UIImage) {
    let url = URL(string: "http://api-host-name/v1/api/uploadfile/single")

    // generate boundary string using a unique per-app string
    let boundary = UUID().uuidString

    let session = URLSession.shared

    // Set the URLRequest to POST and to the specified URL
    var urlRequest = URLRequest(url: url!)
    urlRequest.httpMethod = "POST"

    // Set Content-Type Header to multipart/form-data, this is equivalent to submitting form data with file upload in a web browser
    // And the boundary is also set here
    urlRequest.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    var data = Data()

    // Add the image data to the raw http request data
    data.append("\r\n--\(boundary)\r\n".data(using: .utf8)!)
    data.append("Content-Disposition: form-data; name=\"\(paramName)\"; filename=\"\(fileName)\"\r\n".data(using: .utf8)!)
    data.append("Content-Type: image/png\r\n\r\n".data(using: .utf8)!)
    data.append(image.pngData()!)

    data.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)

    // Send a POST request to the URL, with the data we created earlier
    session.uploadTask(with: urlRequest, from: data, completionHandler: { responseData, response, error in
        if error == nil {
            let jsonData = try? JSONSerialization.jsonObject(with: responseData!, options: .allowFragments)
            if let json = jsonData as? [String: Any] {
                print(json)
            }
        }
    }).resume()
}

如果您要添加任何標頭,可以通過urlRequest.setValue方法添加它。

來源: https : //fluffy.es/upload-image-to-server/

原始主題: 使用Ekta Padaliya 的Alamofire回答將圖像上傳到服務器

使用 AlamoFire 上傳圖片

  1. 安裝指南請按照教程
    https://github.com/Alamofire/Alamofire
    使用的語言Swift 4

  2. 導入AlamoFire

    import Alamofire
  3. 創建自定義方法。
    (可以將此粘貼到 UIViewController 擴展/您的 UIViewcontroller 作為新功能)

     func uploadImage(img: UIImage){ let ImageData = UIImagePNGRepresentation(img) let urlReq = "http://apiUrl.php" let parameters = ["user_id": "useridValue"]//you can comment this if not needed Alamofire.upload(multipartFormData: { multipartFormData in multipartFormData.append(ImageData!, withName: "shop_logo",fileName: "file.jpg", mimeType: "image/jpg") for (key, value) in parameters {// this will loop the 'parameters' value, you can comment this if not needed multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) } }, to:urlReq) { (result) in switch result { case .success(let upload, _, _): upload.uploadProgress(closure: { (progress) in print("Upload Progress: \\(progress.fractionCompleted)") }) upload.responseJSON { response in print(response.result.value) if let dic = response.result.value as? NSDictionary{ //do your action base on Api Return failed/success } } case .failure(let encodingError): print(encodingError) } } }
  4. 像這樣調用方法

    self.uploadImage(img: image)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM