Flask Bilder Upload zu AWS3, Bilder vorm Upload resizen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

Hallo zusammen,

ich habe folgendes Problem:

In meiner APP ist es möglich Bilder hochzuladen, bis zu 15 Stück auf einmal. Nun ist hierbei die Größe der Bilder egal, d.h. wenn jedes Bild 1 MB hat müssen 15 MB hochgeladen werden oder wenn jedes Bild eine Auflösung von 5000 x 3000 hat, dann bleibt das so.

Dies führt dazu, dass der Upload manchmal sehr lange dauern kann, ich bin das Problem früher umgangen, indem ich den APP timeout im Procfile (App liegt auf Heroku) auf 120 Sekunden gesetzt habe und einen Ladebalken eingebaut habe.

Jedoch wäre die bessere Lösung die Bilder zu resizen bevor diese zu Amazon hochgeladen werden, dadurch sollte der Upload wesentlich schneller sein, oder?

Hier ist die Frage wie ist es am besten? Sollte man das mit Javascript machen oder mit Python PIL zum Beispiel? Oder wie wird das Problem grundsätzlich angegangen.

Danke!
BlackJack

@Zoja: Am einfachsten verbietet man solch grosse Bilder einfach und zwingt damit den Nutzer das selber vor dem Hochladen zu ändern. Das verhindert insgesamt Wartezeiten (im Programm) und die Übertragung von grossen Datenmengen.

Der zweite Ansatz ist das verkleinern beim Client. Dann werden nirgends grosse Datenmengen übertragen. Nachteil: Benötigt HTML5 Canvas und die File-API beim Client.

Ansonsten kann man natürlich den Benutzer erst einmal das grosse Bild einfach übertragen lassen und es dann auf dem Server runterskalieren. Nachteil: Zum Server werden grosse Datenmengen übertragen und der Server muss die dann runterskalieren.

Ich würde den Server aber auf jeden Fall gegen grosse Bilder absichern, also sowohl was die Datenmenge als auch die Höhe und Breite des Bilds angeht, um den Aufwand auf dem Server zu begrenzen und DoS-Angriffe auf den Server oder auch andere Clients zu bremsen.
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

BlackJack hat geschrieben:@Zoja: Am einfachsten verbietet man solch grosse Bilder einfach und zwingt damit den Nutzer das selber vor dem Hochladen zu ändern. Das verhindert insgesamt Wartezeiten (im Programm) und die Übertragung von grossen Datenmengen.

Der zweite Ansatz ist das verkleinern beim Client. Dann werden nirgends grosse Datenmengen übertragen. Nachteil: Benötigt HTML5 Canvas und die File-API beim Client.

Ansonsten kann man natürlich den Benutzer erst einmal das grosse Bild einfach übertragen lassen und es dann auf dem Server runterskalieren. Nachteil: Zum Server werden grosse Datenmengen übertragen und der Server muss die dann runterskalieren.

Ich würde den Server aber auf jeden Fall gegen grosse Bilder absichern, also sowohl was die Datenmenge als auch die Höhe und Breite des Bilds angeht, um den Aufwand auf dem Server zu begrenzen und DoS-Angriffe auf den Server oder auch andere Clients zu bremsen.
Alles klar, vielen Dank für die Antwort!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Upload hat keine Probleme, er ist das Problem. Du solltest die Uploads zu S3 direkt gehen lassen statt durch deine Anwendung, dann bist du diese Probleme los.
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

DasIch hat geschrieben:Der Upload hat keine Probleme, er ist das Problem. Du solltest die Uploads zu S3 direkt gehen lassen statt durch deine Anwendung, dann bist du diese Probleme los.
d.h. mit JS direkt uploaden? Aber die files können immer noch sehr groß sein, würde der client dann nicht auch lange brauchen?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Zoja: ein Javascript-Image-Resizer ist hier erklärt. Das verhindert aber nicht, dass jemand das Javascript umgeht und doch wieder direkt riesige Dateien hochlädt. Da hilft nur ein Größenlimit, das man am besten gleich den Webserver prüfen läßt, der dann gleich den Upload abbrechen kann.
BlackJack

Und nur noch mal das das nicht untergeht: Grösse prüfen heisst nicht nur Dateigrösse prüfen, sondern auch die Pixelabmessungen begrenzen. Sonst können immer noch Spassvögel kleine Dateien hochladen, mit komprimierten Grafikformaten die dann beim dekomprimieren aber absurde Ausmasse haben und beim Client den Speicher sprengen wenn der versucht die anzuzeigen.
Zoja
User
Beiträge: 145
Registriert: Freitag 28. Februar 2014, 14:04

BlackJack hat geschrieben:Und nur noch mal das das nicht untergeht: Grösse prüfen heisst nicht nur Dateigrösse prüfen, sondern auch die Pixelabmessungen begrenzen. Sonst können immer noch Spassvögel kleine Dateien hochladen, mit komprimierten Grafikformaten die dann beim dekomprimieren aber absurde Ausmasse haben und beim Client den Speicher sprengen wenn der versucht die anzuzeigen.
Jep danke! prüfe erstmal die Größe mit:

Code: Alles auswählen

# rejects too big images - max 15 MB 
MAX_CONTENT_LENGTH = 15 * 1024 * 1024
Antworten