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

    Neu

    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. ...
  • Mac & i Test Abo
  • Neu

    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
  • Neu

    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
  • Neu

    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 :)
  • Neu

    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.
  • Neu

    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 ?