Image Upload dauert ewig lange

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Image Upload dauert ewig lange

    Hallo,

    ich habe aktuell das Problem das mein Image Upload sehr sehr lange braucht bis das ganze beim Server ankommt. Ich habe bereits meine Internetverbindung geprüft und ein Upload von 5,9 Mbps kann schon mal nicht das Problem sein. Die Bilder sind alle immer so um die 1 Mb groß.

    Kann es eventuell am Server liegen ? Kennt sich jemand vielleicht mit Uploads aus und weiß was in so einem Fall zu tun ist ?

    Ich bin für jeden Ratschlag dankbar, ich weiß nämlich überhaupt nicht wie ich jetzt vorgehen soll.

    Hier mein Code:

    Quellcode

    1. guard let uploadData = try? JSONEncoder().encode(jpegImages) else {return}
    2. var request = URLRequest(url: url)
    3. request.setValue(login_session, forHTTPHeaderField: "Authorization")
    4. request.setValue(questionInputField.text, forHTTPHeaderField: "title")
    5. request.setValue(String(cellPrivacyStatus), forHTTPHeaderField: "private")
    6. request.setValue(categorieName, forHTTPHeaderField: "tag")
    7. request.setValue(String(timePickerValue), forHTTPHeaderField: "expires")
    8. request.httpMethod = "POST"
    9. request.httpBody = uploadData
    10. let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
    11. guard let data = data else { return }
    12. do {
    13. self.json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any]
    14. if let parseJSON = self.json {
    15. let session = parseJSON["data"]
    16. print(session as Any)
    17. }
    18. } catch let error {
    19. print(error.localizedDescription)
    20. }
    21. })
    22. task.resume()
    Alles anzeigen


    Hiermit setze ich encode ich meine Bilder in JSON:

    Quellcode

    1. DispatchQueue.main.async {
    2. guard let convertImage = image.key!.jpegData(compressionQuality: 1.0) else {return}
    3. let imageSize: Int = convertImage.count
    4. print("actual size of image in KB: %f ", Double(imageSize) / 1000.0)
    5. self.jpegImages.append(convertImage)
    6. }


    Hiermit fetche ich die Bilder:


    Quellcode

    1. imgManager.requestImage(for: fetchResult.object(at: indexPath.row) , targetSize: CGSize(width: 1080, height: 1920), contentMode: .aspectFill, options: requestOptionsImage, resultHandler: {
    2. image, error in
    3. ...
  • MCDan schrieb:

    Prüfe mal wie große uploadData nach dem Encoding ist.

    Ermittle doch mal die verstrichene Zeit zwischen resume und dem completionHandler Aufruf.
    Größe von uploadData ist nach dem Encoding: 24134.544KB


    Die Zeit beträgt: 0.0005019903182983398 ms

    Ich muss aber sagen das ich erst dann die Ausgabe der Zeit in der Konsole sehen kann wenn das ganze auch beim Server angekommen ist.

    Also rein von den Werten her, sieht doch eigentlich alles recht solide aus oder was würdet ihr sagen ?

    Habe die Zeit so gemessen, hoffe dass das so auch richtig ist:

    Quellcode

    1. guard let uploadData = try? JSONEncoder().encode(jpegImages) else {return}
    2. var request = URLRequest(url: url)
    3. request.setValue(login_session, forHTTPHeaderField: "Authorization")
    4. request.setValue(questionInputField.text, forHTTPHeaderField: "title")
    5. request.setValue(String(cellPrivacyStatus), forHTTPHeaderField: "private")
    6. request.setValue(categorieName, forHTTPHeaderField: "tag")
    7. request.setValue(String(timePickerValue), forHTTPHeaderField: "expires")
    8. request.httpMethod = "POST"
    9. request.httpBody = uploadData
    10. let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
    11. let methodStart = NSDate()
    12. guard let data = data else { return }
    13. do {
    14. self.json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any]
    15. if let parseJSON = self.json {
    16. let session = parseJSON["data"]
    17. print(session as Any)
    18. }
    19. } catch let error {
    20. print(error.localizedDescription)
    21. }
    22. let methodFinish = NSDate()
    23. let executionTime = methodFinish.timeIntervalSince(methodStart as Date)
    24. print("Execution time: \(executionTime)")
    25. })
    26. task.resume()
    Alles anzeigen
  • Gut das wär sonst recht kurios haha. Ich habe die Zeit jetzt nochmal an anderer Stelle gemessen: 0.24484801292419434
    In dieser Zeit wird der gesamte Code durchgehauen.

    Trotz alldem dauert es nachdem ich auf den Upload Button geklickt habe rund 11 Sekunden bis ich die Antwort vom Server bekomme. Die Antwort bekomme ich sobald die Bilder angekommen sind.

    Kann ich anhand der Zeit also sagen das der Code soweit stimmt und das Problem also woanders liegt, vielleicht beim Server ?

    Hier die aktuelle Zeitmessung:

    Quellcode

    1. let methodStart = NSDate()
    2. guard let uploadData = try? JSONEncoder().encode(jpegImages) else {return}
    3. var request = URLRequest(url: url)
    4. request.setValue(login_session, forHTTPHeaderField: "Authorization")
    5. request.setValue(questionInputField.text, forHTTPHeaderField: "title")
    6. request.setValue(String(cellPrivacyStatus), forHTTPHeaderField: "private")
    7. request.setValue(categorieName, forHTTPHeaderField: "tag")
    8. request.setValue(String(timePickerValue), forHTTPHeaderField: "expires")
    9. request.httpMethod = "POST"
    10. request.httpBody = uploadData
    11. let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
    12. guard let data = data else { return }
    13. do {
    14. self.json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any]
    15. if let parseJSON = self.json {
    16. let session = parseJSON["data"]
    17. print(session as Any)
    18. }
    19. } catch let error {
    20. print(error.localizedDescription)
    21. }
    22. })
    23. task.resume()
    24. let methodFinish = NSDate()
    25. let executionTime = methodFinish.timeIntervalSince(methodStart as Date)
    26. print("Execution time: \(executionTime)")
    Alles anzeigen
  • Ich hatte auch dasselbe Problem mal und bei mir war es die schiere Größe des Bildes. 24MB ist eine ganze Menge.

    Nachdem ich die Größe des Bildes runtergeschraubt habe ging es um einiges schneller.

    EDIT: Du misst immer noch falsch. Das Stoppen der Zeit musst du nach print(session as Any) machen. Weil das in dem Completion Handler ist
  • 24MB Upload für ein Bild. Bist du noch zu retten? Soviel hat ja nicht einmal ein lossless raw formatted image einer Profi Spiegel Reflex Camera.

    Images packt man nicht in ein Json dafür ist das Format überhaupt nicht gemacht. Übertrage das gefälligst als binary wie es sich gehört
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    24MB Upload für ein Bild. Bist du noch zu retten? Soviel hat ja nicht einmal ein lossless raw formatted image einer Profi Spiegel Reflex Camera.

    Images packt man nicht in ein Json dafür ist das Format überhaupt nicht gemacht. Übertrage das gefälligst als binary wie es sich gehört
    Erstmal danke für die Antwort, beim nächsten mal aber vielleicht einen anderen Unterton wählen. Um genau zu sein handelt es sich um drei Bilder die ich gleichzeitig hochgeladen habe. Habe die Größe mittlerweile auch runtergeschraubt. Soweit ich weiß ist das Format das ich zum Upload verwende auch das richtige.
  • AppleDeveloper schrieb:

    Ich hatte auch dasselbe Problem mal und bei mir war es die schiere Größe des Bildes. 24MB ist eine ganze Menge.

    Nachdem ich die Größe des Bildes runtergeschraubt habe ging es um einiges schneller.

    EDIT: Du misst immer noch falsch. Das Stoppen der Zeit musst du nach print(session as Any) machen. Weil das in dem Completion Handler ist


    Also du hast recht es hat einfach was mit der Größe der Bilder zu tun. Aktuell will ich drei Bilder gleichzeitig hochladen. Habe die Größe der Bilder angepasst und die compressionQuality etwas runtergeschraubt -> jpegData(compressionQuality: 0.65)

    Ich kann jetzt mit der Uploadgeschwindigkeit und der Qualität leben. Gibt es aber vielleicht noch einen Weg die compressionQuality zu erhöhen ohne weitere Einbußen in der Größe zu haben ?
  • ThisIsBeat schrieb:

    Die Bilder sind alle immer so um die 1 Mb groß.

    ThisIsBeat schrieb:

    Größe von uploadData ist nach dem Encoding: 24134.544KB
    Wenn es drei Bilder sind und diese nach dem Encoding ein vielfaches an Speicher belegen, dann ist doch etwas grundlegendes falsch.

    ThisIsBeat schrieb:

    Soweit ich weiß ist das Format das ich zum Upload verwende auch das richtige.
    Sorry, aber der Unterton von @Tallius passt, da JSON dafür einfach nicht geeignet ist.
  • nussratte schrieb:

    Der Ton von Claus ist das absolut letzte und passt null zur Diskussion

    Wenn er nicht antworten will soll er es sein lassen

    Aber man kennt ja nichts anderes von ihm

    Ach Rättchen, kriech wieder zurück in deinen Gully. Ich weiß das du mich nicht magst, das beruht aber auf Gegenseitigkeit. Also ignorier mich doch bitte in Zukunft genauso wie ich dich ignorieren werde.


    Zum Thema,

    Ich habe lediglich sehr deutlich zum Ausdruck gebracht, dass hier blödsinn programmiert wird. Ich habe keine beleidigt noch habe ich mich im Ton vergriffen.
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Abgesehen von Claus Einwand fällt mir noch einiges ein.

    Ist der Server unter deiner Kontrolle oder hast du Zugriff darauf? Der kann auch lahm sein.
    Networkdebugging einschalten.
    developer.apple.com/documentat…etwork_diagnostic_logging
    mit nscurl --ats-diagnostics prüfen was der Server für SSL Versionen kann.
    Ich hab muss bei einem Server in unserer Software TLS 1.3 abschalten weil der sonst nur Fehlerhaft antwortet.
    Ich vermisse den Content-Type. der ist application/jason
    Instruments kannst du auch einsetzen.
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • So, nun atmen wir mal wieder tief durch und benehmen uns nicht wie im Kindergarten, okay?

    Ja, manchmal wird der Ton etwas schroffer und nicht jeder Formulierung würde m. E. im persönlichen Gespräch benutzt werden ... aber so ist das in Web-Foren eben manchmal. Jetzt droht Ihr aber ziemlich abzudriften, macht Euch locker :D

    Urlaubsgrüsse, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Vielleicht noch ein letztes Kommentar zu dem ganzen. Grundsätzlich bin ich der Meinung das man sich immer mit dem nötigen Respekt begegnen sollte, ob nun im Internet oder im wahren Leben. Ich bin jetzt kein absoluter Anfänger mehr in Sachen Swift aber auch kein Vollprofi. Wenn ich schon alles wissen würde dann würde ich mit Sicherheit nicht eine solche Frage in diesem Forum posten.
    Und ob nun "Blödsinn" (was ganz nebenbei auch wieder so ne Formulierung in dem Zusammenhang ist...) oder nicht, denke ich das man alles auch ne Stufe netter verpacken kann bzw. sich auf einem anderen Niveau ausdrücken können sollte.

    Jetzt aber wieder zurück zum Thema. Also ich verwende aktuell eine Funktion die meine Bilder resized. Wie gesagt dadurch habe ich die Upload Menge auf 900Kb reduziert und der Upload geht viel schneller über den Tisch. Einziger Haken ist das ich die compressionQuality senken muss. Die Qualität ist wie gesagt so das ich damit leben kann aber man will ja immer das Optimum rausholen.
    Wenn ich also jetzt noch die compressionQuality erhöhen könnte ohne weitere Einbußen zu haben wäre das super !

    Quellcode

    1. func resize(_ image: UIImage) -> UIImage {
    2. var actualHeight = Float(image.size.height)
    3. var actualWidth = Float(image.size.width)
    4. let maxHeight: Float = 1080.0
    5. let maxWidth: Float = 1080.0
    6. var imgRatio: Float = actualWidth / actualHeight
    7. let maxRatio: Float = maxWidth / maxHeight
    8. let compressionQuality: Float = 0.65
    9. //50 percent compression
    10. if actualHeight > maxHeight || actualWidth > maxWidth {
    11. if imgRatio < maxRatio {
    12. //adjust width according to maxHeight
    13. imgRatio = maxHeight / actualHeight
    14. actualWidth = imgRatio * actualWidth
    15. actualHeight = maxHeight
    16. }
    17. else if imgRatio > maxRatio {
    18. //adjust height according to maxWidth
    19. imgRatio = maxWidth / actualWidth
    20. actualHeight = imgRatio * actualHeight
    21. actualWidth = maxWidth
    22. }
    23. else {
    24. actualHeight = maxHeight
    25. actualWidth = maxWidth
    26. }
    27. }
    28. let rect = CGRect(x: 0.0, y: 0.0, width: CGFloat(actualWidth), height: CGFloat(actualHeight))
    29. UIGraphicsBeginImageContext(rect.size)
    30. image.draw(in: rect)
    31. let img = UIGraphicsGetImageFromCurrentImageContext()
    32. let imageData = img?.jpegData(compressionQuality: CGFloat(compressionQuality))
    33. UIGraphicsEndImageContext()
    34. return UIImage(data: imageData!) ?? UIImage()
    35. }
    Alles anzeigen

    PS: Ich verstehe nebenbei nicht warum manche von euch behaupten das JSON dafür nicht geeignet sei. Sämtliche Quellen die ich mir angeschaut habe sagen das encodete Images sehr wohl über den Body versendet werden können. Zumal ich die Bilder bereits in binary Data konvertiere (developer.apple.com/documentat…/uiimage/1624115-jpegdata). Eure Quellen in Form von Links oder auch gerne Beispiele würde ich gerne sehen. Will ja was dazu lernen.