2017-06-23 10 views
0

Liebe Community mit Stackoverflow,Alamofire - Bild hochladen schlägt fehl, wenn Fotos

Ich arbeite an einem iOS-App, die Alamofire verwendet eine JSON sendet zusammen mit Bildern auf ein REST-API. Die Bilder werden mit einem Bilderwähler abgerufen und in einem Array gespeichert. Das Problem ist, dass das Hochladen von Bildern so lange dauert, wie ich heruntergeladene Bilder aus dem Internet usw. verwende. Sobald ich versuche, ein Foto hochzuladen, das mit dem Telefon aufgenommen wurde, das ich gerade benutze (ausgewählt aus der Foto-Bibliothek) schlägt fehl und löst 400 - Bad Request Fehler aus. Das seltsame ist, dass wenn ich Fotos hochladen kann, die von einem anderen iPhone stammen, aber an mich gesendet wurden, aber Fotos, die mit dem Telefon selbst aufgenommen wurden, funktionieren nicht ... Hat jemand eine Idee, warum dieses Problem auftritt tritt ein? Ich habe den Verdacht, dass das Format oder die Daten von iPhone-Fotos anders sein könnten als heruntergeladene, wegen HDR und anderen Sachen, aber ich bin mir nicht sicher, ob das das Problem ist. Hier

ist der Code, den ich verwende, die ziemlich Standard aber:

func POST_WITH_ATACHMENTS(description: String, attachments: [UIImage], returnCompletion: @escaping (Bool) ->()) { 
    let parameters = ["ticket":"{ \"description\" : \"" + description + "\"}"] 

    APIManager.Manager.upload(multipartFormData: { multipartFormData in 
     for (key, value) in parameters { 
      multipartFormData.append((value.data(using: .utf8)!), withName: key, mimeType: "application/json") 
     } 

     var counter = 1 
     for image in attachments { 
      multipartFormData.append(UIImagePNGRepresentation(image)!, withName: "attachments", fileName: "attachment" + String(counter) + ".png", mimeType: "image/png") 
      counter += 1 
     } 
    }, 
        to: restURL!, 
        method: .post, 
        headers:["Authorization" : loginString], 
        encodingCompletion: { encodingResult in 
         switch encodingResult { 
         case .success(let upload, _, _): 
          upload.responseJSON { response in 
           debugPrint(response) 
           if (upload.response?.statusCode == 201) { 
            returnCompletion(true) 
           } else { 
            returnCompletion(false) 
           } 
          } 
         case .failure(let encodingError): 
          print(encodingError) 
          returnCompletion(false) 
         } 
    }) 
} 
+0

versuchen, mithilfe 'Bild/jpeg' als MIME-Typ. Weil dies den meisten Bildformaten wie '.jpg',' .jpeg', '.jfif' gemeinsam ist. –

+0

Ich habe deine Lösung ausprobiert und herausgefunden, dass es von der Größe des Bildes abhängt, denke ich ... wenn ich den Größenfaktor auf 0,5 setze, funktioniert das Foto-Upload, aber unkomprimiert funktioniert es nicht .... seltsam, der Server tut es wahrscheinlich nicht unterstütze Bilder so groß. Vielen Dank! –

+0

Es gibt eine Option zum Streamen von Inhalten in 'Alamofire'. Schau es dir an. Kann nützlich sein, um große Bilder hochzuladen. –

Antwort

0

Hier ist webservice für das Hochladen von Bild AlamoFire mit

class WebServiceHandler: AnyObject { 

    func uploadWithAlamofire(Parameters params : [NSObject : AnyObject]?,ImageParameters imgparams : [NSObject : AnyObject]?,Action action : NSString, success: @escaping (AnyObject) -> Void, failure: @escaping (AnyObject) -> Void) 
    { 
     var base_url = "YOUR BASE_URL" 
     base_url.append(action as String) 

     Alamofire.upload(multipartFormData: { multipartFormData in 
      if imgparams != nil{ 
       for (key, value) in imgparams! { 
        if let imageData = UIImageJPEGRepresentation(value as! UIImage, 1) { 
         multipartFormData.append(imageData, withName: key as! String, fileName: "\(NSDate().timeIntervalSince1970 * 1000)).jpg", mimeType: "image/jpg") 
        } 
       } 
      } 

      if params != nil 
      { 
       for (key, value) in params! { 
        multipartFormData.append((value as! String).data(using: .utf8)!, withName: key as! String) 
       } 

      } }, to: base_url, method: .post, headers: nil, 
       encodingCompletion: { encodingResult in 
        switch encodingResult { 
        case .success(let upload, _, _): 
         upload.uploadProgress { progress in 
          print(progress.fractionCompleted) 
         } 
         upload.response { [weak self] response in 
          guard self != nil else { 
           return 
          } 
          let responseString = String(data: response.data!, encoding: String.Encoding.utf8) 
          return success(responseString as AnyObject) 

         } 
        case .failure(let encodingError): 
         print("error:\(encodingError)") 
         return failure(encodingError as AnyObject) 
        } 
     }) 
    } 
    func convertToDictionary(text: String) -> [String: Any]? { 
     if let data = text.data(using: .utf8) { 
      do { 
       return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] 
      } catch { 
       print(error.localizedDescription) 
      } 
     } 
     return nil 
    } 
} 


----------------------------USAGE----------------------------- 

let dict_params = NSMutableDictionary() 
dict_params.set("123", forKey:"YourKey") 
dict_params.set("123", forKey:"YourKey") 
. 
. 
.and so on 

let imgparam = NSMutableDictionary() 
imgparam.set(YourImagetoUpload, forKey: "YourKey") 
//here YourImagetoUpload is like imageview.image or UIImage(named: "123.png") 
imgparam.set(YourImagetoUpload, forKey: "YourKey") 
. 
. 
.and so on 


self.webservice.uploadWithAlamofire(Parameters: dict_params as [NSObject : AnyObject], ImageParameters: imgparam as [NSObject : AnyObject], Action: "API_ACTION_CALL", success: { (success) in 
     print(success) 
}) { (error) in 
     print(error) 
} 
+0

Vielen Dank! Die Methode ist meiner ähnlich, daher denke ich, dass das Problem wirklich auf der Serverseite liegt, wo die REST-API keine so großen Bilder unterstützt, ich könnte die vorgeschlagene Stream-Version versuchen oder die Bilder verkleinern, da sie das nicht müssen in voller Auflösung für mein Projekt sein. –

Verwandte Themen