Загрузить изображение и параметры в API с помощью URLSession.shared.uploadTask - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь решить, как загрузить набор параметров и файл изображения в мой API с помощью swift.

Мой код примерно в этой точке:

//parameters
    let actualParameters = ["email": myEmail, "token": myToken, "certnbr": certnbr, "title": title, "newCert": newCert, "expires": expires, "expiryDate": expiryDate, "issueDate": issueDate] as! [String : Any]

    let parameters = NewCertModel(email: "email")

    //create the url with URL
    let url = URL(string: "http://127.0.0.1:8000/api/newCertification/")!

    //now create the URLRequest object using the url object
    var request = URLRequest(url: url)

    request.httpMethod = "POST"
    let boundary = "Boundary-\(UUID().uuidString)"
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")

    request.httpBody = createBody(parameters: params,
                            boundary: boundary,
                            data: UIImageJPEGRepresentation(chosenImage, 0.7)!,
                            mimeType: "image/jpg",
                            filename: "hello.jpg")

    guard let uploadData = try? JSONEncoder().encode(parameters) else {
        print("Error Upload Data")
        return
    }


    //new session
    URLSession.shared.uploadTask(with: request as URLRequest, from: jsonData as! Data) { (responseData, response, error) in
                                    // Check on some response headers (if it's HTTP)
                                    if let httpResponse = response as? HTTPURLResponse {
                                        switch httpResponse.statusCode {
                                        case 200..<300:
                                            print("Success")
                                        case 400..<500:
                                            print("Request error")
                                        case 500..<600:
                                            print("Server error")
                                        case let otherCode:
                                            print("Other code: \(otherCode)")
                                        }
                                    }

                                    // Do something with the response data
                                    if let
                                        responseData = responseData,
                                        let responseString = String(data: responseData, encoding: String.Encoding.utf8) {
                                        print("Server Response:")
                                        print(responseString)
                                    }

                                    // Do something with the error
                                    if let error = error {
                                        print(error.localizedDescription)
                                    }
    }

    .resume()
    }
}

Код не идеален, потому что я пробовал довольно много решений, и теперь они немного перемешаны.Я могу легко передавать данные в мой API, но загрузка файла / несколько частей поставили меня в тупик.Я нахожу ресурсы для этого очень трудными для поиска и ограниченными, особенно из-за полной занятости в Android.

Я мог бы переключиться на Alamofire, но весь мой проект еще не использует его.Я хотел бы подождать, чтобы переключиться.Я легко потратил 5 часов, пытаясь комбинировать, чтобы даже показать малейшие переданные данные, но пока ничего.

Вот начало моего кода на Python:

if request.method == 'POST':

email = request.POST.get('email')
token = request.POST.get('token')
certnbr = request.POST.get('certnbr')
title = request.POST.get('title')
newCert = request.POST.get('newCert')
expires = request.POST.get('expires')
expirydate = request.POST.get('expiryDate')
issuedate = request.POST.get('issueDate')
picfile = request.FILES.get('image')

data = {}

#get the user
u = Usr.objects.get(email__iexact=email)

Некоторые источники мне не повезлос:

fluffy.es - «Этот код выглядит для меня таким неряшливым?»

средняя статья - «Я не смог найтиподсказка передачи параметров здесь "

stackoverflow

больше stackoverflow

далее stackoverlow

Что удивляет меня, так это несоответствие между всеми этими источниками, только некоторые даже используют uploadTask, плюс я прочитал дюжину других, которые, казалось, отличались.В конечном счете, Alamofire - лучший выбор?Почему бы Apple просто не принять это?Весь этот процесс на удивление сложен, заранее благодарю за любую помощь.

РЕДАКТИРОВАТЬ: я переключился на Alamofire, мгновенно проще.

1 Ответ

0 голосов
/ 26 апреля 2019

Хотя это и не лучший ответ на мой вопрос, код Alamofire просто чище.Поэтому, чтобы спасти любое будущее, я испытываю стресс.Просто используйте Alamofire.

Alamofire Github

let ImageData = imageobj.pngData()
    let urlReq = URL(string: "http://127.0.0.1:8000/api/newCertification/")!
    print("params")
    let params : Parameters = ["email": myEmail, "token": myToken, "certnbr": certnbr, "title": title, "newCert": newCert, "expires": expires, "expiryDate": expiryDate as Any, "issueDate": issueDate as Any]
    print("time to upload")
    Alamofire.upload(multipartFormData: { multipartFormData in
        multipartFormData.append(ImageData!, withName: "avatar",fileName: "file.jpg", mimeType: "image/jpg")
        for (key, value) in params {// this will loop the 'parameters' value, you can comment this if not needed
            multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, 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
                //completion("success")
            }

        case .failure(let encodingError):
            print(encodingError)
            //completion("failed")


    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...