Pytanie Jak wgrać obraz z parametrami za pomocą Alamofire w Swift


Pracuję nad aplikacją na iPhone'a z szybkim. i używam Struktura Alamofire do obsługi żądań http. używam Alamofire.request dla POST, GET itp. w następujący sposób:

Alamofire.request(.POST, myURL , parameters: ["a": "1", "b" : "2" ])
        .response { (request, response, data, error) in
}  

I używam Alamofire.upload aby przesłać obraz na serwer to:

Alamofire.upload(.POST, uploadURL , fileURL)

Oba działają idealnie, ale teraz chcę przesłać obraz, a także wysłać kilka parametrów za pomocą, a mój typ zawartości powinien być multipart/form-data i Alamofire.upload nie przyjmuje parametrów.

Są jeszcze dwa pytania na SO dotyczące tego problemu z szybkim, który pierwszy nie używa Alamofire (i naprawdę, dlaczego nie?) i in Drugi, mattt (Alamofire Developer) powołał się na użycie parametrów kodowania.

Sprawdziłem jego przykład, ale wciąż nie mogłem wymyślić, jak to zrobić.

Czy ktoś może mi pomóc rozwiązać ten problem?

Dziękuję Ci! :)


18
2017-10-21 22:52


pochodzenie


Oto rozwiązanie, które znalazłem, umieszczone na innym pytaniu: stackoverflow.com/questions/26121827/... - antiblank
Reza_Rg Czy możesz mi pomóc? Używam również "Alamofire.upload (.POST, uploadURL, fileURL)", ale w jaki sposób mam strukturę pliku php, aby otrzymać plik? Gdzie plik przesłany przez .POST jest dostępny w moim pliku php? - gutenmorgenuhu
@Reza_Rg rozwiązałeś swój problem, jeśli tak, możesz podzielić się odpowiedzią? - user2363025
@ user2363025 Tak, ale skończyłem na zmianie niektórych kodów w bibliotece Alamofire, co nie jest właściwe. - Reza_Rg


Odpowiedzi:


możesz użyć Alamofire 3.0+ poniżej kodu

func uploadImageAndData(){
    //parameters
    let gender    = "M"
    let firstName = "firstName"
    let lastName  = "lastName"
    let dob       = "11-Jan-2000"
    let aboutme   = "aboutme"
    let token     = "token"

    var parameters = [String:AnyObject]()
    parameters = ["gender":gender,
                  "firstName":firstName,
                  "dob":dob,
                  "aboutme":about,
                  "token":token,
                  "lastName":lastName]

    let URL = "http://yourserviceurl/"
    let image = UIImage(named: "image.png")

    Alamofire.upload(.POST, URL, multipartFormData: {
        multipartFormData in

        if let imageData = UIImageJPEGRepresentation(image, 0.6) {
            multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png")
        }

        for (key, value) in parameters {
            multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
        }
    }, encodingCompletion: {
        encodingResult in

        switch encodingResult {
        case .Success(let upload, _, _):
            print("s")
            upload.responseJSON { 
                response in
                print(response.request)  // original URL request
                print(response.response) // URL response
                print(response.data)     // server data
                print(response.result)   // result of response serialization

                if let JSON = response.result.value {
                    print("JSON: \(JSON)")
                }
            }
        case .Failure(let encodingError):
            print(encodingError)
        }
    })
}

20
2018-02-16 17:16



Daje mi to kod statusu 415 - Chamath Jeevan
Błąd HTTP 415 Nieobsługiwany typ nośnika plz sprawdź typ obrazu @chamathjeevan - amit gupta
Jeśli istnieje klucz "image" w następującym parametrze ["gender": gender, "firstName": firstName, "dob": dob, "aboutme": aboutme, "token": token, "lastName": lastName, "image ": imageData], a następnie multipartFormData.appendBodyPart (dane: imageData, nazwa:" image ", fileName:" file.png ", mimeType:" image / png ") zostaną dodane w parametrach? - Deepak Thakur
@amitgupta Mam nadzieję, że dostałeś moje pytanie powyżej - Deepak Thakur
och człowieku, edytuj swój kod. To jest bałagan do przeczytania. - Fogmeister


Łatwe przesyłanie obrazów SWIFT 2 AlamoFire (REST API)

@amit gupta Wygląda na to, że odpowiedź zawiera duże obciążenie. AlamoFire zawiera ładunek uproszczonego rozwiązania. Metoda Alamofire.request zawiera kilka uproszczonych przeciążeń, których można użyć do przesłania w prosty sposób. Korzystając z Alamofire.request (twórca metod może pozbyć się nadmiaru kodu.

Stan HTTP 415 podaje, ponieważ nie określono prawidłowego typu nośnika.

Sprawdź moje rozwiązanie poniżej.

import UIKit
import Alamofire

class ViewController: UIViewController {

    @IBOutlet var imageView: UIImageView!
    @IBOutlet var btnUpload: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func successDataHandler(responseData:String){

        print ("IMAGE UPLOAD SUCCESSFUL    !!!")

    }

    func failureDataHandler(errorData:String){

        print ("  !!!   IMAGE UPLOAD FAILURE   !!! ")

    }

    @IBAction func actionUpload(sender: AnyObject) {

        let URL = "http://m8coreapibeta.azurewebsites.net/api/cards/SaveImages"

        let postDataProlife:[String:AnyObject] = ["CardId":(dataCardDetail?.userId)!,"ImageType":1,"ImageData":imageView.image!]

        uplaodImageData(URL, postData: postDataProlife, successHandler: successDataHandler, failureHandler: failureDataHandler)
    }

    func uplaodImageData(RequestURL: String,postData:[String:AnyObject]?,successHandler: (String) -> (),failureHandler: (String) -> ()) -> () {

        let headerData:[String : String] = ["Content-Type":"application/json"]

        Alamofire.request(.POST,RequestURL, parameters: postData, encoding: .URLEncodedInURL, headers: headerData).responseString{ response in
            switch response.result {
            case .Success:
                print(response.response?.statusCode)
                successHandler(response.result.value!)
            case .Failure(let error):
                failureHandler("\(error)")
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

4
2018-03-19 02:11





Almaofire z szybkim 3.0

Alamofire.upload(multipartFormData: { multipartFormData in
    var index = 1
    for image in imageArray {
        let imageData: Data = (UIImageJPEGRepresentation(image, 1.0) as Data?)!

        multipartFormData.append(imageData, withName: "home-\(index)", fileName: "home-\(index)", mimeType: "image/jpeg")

        index += 1
    }
    }, with: requestName, encodingCompletion: { result in
        switch result {
        case .success(let upload, _, _):

            upload.responseJSON { response in
                print("Image(s) Uploaded successfully:\(response)")
            }
        case .failure(let encodingError):
            print("encodingError:\(encodingError)")
        }
})

3
2018-04-08 07:42



moim problemem są nazwy i katalogi zdjęć, jak uzyskać obrazy w katalogach galerii i ich nazwiskach? - Saeed Rahmatolahi


Almaofire z szybkim 2.0  po prostu skopiuj i wklej poniżej code.here m asumming odpowiedzi JSON z serwera

 func uploadImageRemote (imageData : NSData?) -> Dictionary <String,AnyObject>{
    var imageDictionary = Dictionary<String,AnyObject>()

      var tokenHeaders:[String:String]! = ["x-access-token":Constants.kUserDefaults.stringForKey("userToken")!]
    Alamofire.upload(
        .POST,
        "http://52.26.230.146:3300/api/profiles/imageUpload",headers:tokenHeaders,
        multipartFormData: { multipartFormData in
            multipartFormData.appendBodyPart(data: imageData!, name: "upload", fileName: "imageFileName.jpg", mimeType: "image/jpeg")
        },
        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(),{

                    })
                }
                upload.responseJSON { response in
                    guard response.result.error == nil else {
                        print("error calling GET \(response.result.error!)")
                        return
                    }

                    if let value = response.result.value {
                       print("Success JSON is:\(value)")
                        if let result = value as? Dictionary<String, AnyObject> {
                            imageDictionary["imageUrl"] = result["url"]
                        }
                    }

                    dispatch_async(dispatch_get_main_queue(),{
                        //Show Alert in UI
                        print("Avatar uploaded");
                    })
                }

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



return imageDictionary
}

0
2017-07-28 10:36





Swift 4 z Alamofire 4

let isConnected = connectivity.isConnectedToInternet()

  func updateProfile(firstName:String,lastName:String ,imageData:Data?,completion: @escaping (isValidUser)->()) {


    if self.isConnected {

        var parameters : [String:String] = [:]
        parameters["auth_key"] = loginUser?.authKey!
        parameters["User[first_name]"] = firstName
        parameters["User[last_name]"] = lastName

        let url = "\(baseUrl)\(basicAuthenticationUrl.updateProfile)"
        print(url)


        Alamofire.upload(multipartFormData: { (multipartFormData) in
            for (key, value) in parameters {
                multipartFormData.append("\(value)".data(using: String.Encoding.utf8)!, withName: key as String)
            }

            if let data = imageData {
                multipartFormData.append(data, withName: "image_url", fileName: "image.png", mimeType: "image/png")
            }

        }, usingThreshold: UInt64.init(), to: url, method: .post) { (result) in
            switch result{
            case .success(let upload, _, _):
                upload.responseJSON { response in
                    print("Succesfully uploaded  = \(response)")
                    if let err = response.error{

                        print(err)
                        return
                    }

                }
            case .failure(let error):
                print("Error in upload: \(error.localizedDescription)")

            }
        }
    }

}

0
2018-02-17 12:01





Aby użyć parametrów kodowania, należy utworzyć zmienną ParameterEncoding, przypisać jej typ kodowania (przypadek wyliczenia, który zawiera .JSON, .URL), a następnie użyć funkcji kodowania z parametrem NSURLRequest i parametrami. Ta funkcja zwraca krotkę dwóch elementów, z których pierwsza jest wynikiem NSURLRequest, a druga jest wynikiem możliwego NSError.

Oto jak użyłem go do niestandardowego nagłówka, którego potrzebowałem w projekcie

 var parameterEncoding:ParameterEncoding!
    switch method {
        case .POST, .PUT :
            parameterEncoding = ParameterEncoding.JSON
        default :
            parameterEncoding = ParameterEncoding.URL
    }
    var alamoRequest = Alamofire.Manager.sharedInstance.request(parameterEncoding.encode(mutableURLRequest, parameters: parameters).0)

-3
2017-10-24 17:05