Prüfung auf Dateivollständigkeit

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BruderB
User
Beiträge: 3
Registriert: Freitag 16. März 2018, 13:02

Moin Liste,

dies ist mein erstes Posting hier. In Python möchte ich mich ein bisschen einarbeiten, um 'dran' zu bleiben. Ich habe leidlich Erfahrung mit Perl, PHP, früher Pascal....

In meinem erstes Projekt stoße ich auf eine Herausforderung, die eigentlich ganz häufig auftreten müsste. Trotzdem finde ich nicht wirklich etwas Naheliegendes dazu und bitte deshalb hier um Gedankenbeiträge:
Ich werkele auf einem Linux-WebDAV-Server. In ein Verzeichnis lädt mein Fotoapparat gelegentlich ein paar Bilder hoch. Alle paar Minuten startet cron mein Python-Skript, das dieses Verzeichnis nach Bildern durchsucht und eine Konvertierung in ein anderes Bildformat durchführt (mit imagemagick).
Frage jetzt:
Wie kann ich verhindern, dass die Konvertierung angestoßen wird, wenn der Upload noch nicht vollständig ist? Oder anders: Wie kann ich prüfen, ob ein JPG 'vollständig' ist?

Vielen Dank für Eure Ideen dazu!

Grüße,

BruderB
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Indem du es konvertierst & bei einem Fehler halt später nochmal machst. Denn es gibt in dem Sinne keine Benachrichtigung wann da was fertig ist.

Es gibt ein paar andere Vorgehensweisen die zb rsync benutzt. Das geht aber nur, wenn der schreibende Prozess das macht. Nämlich in eine temporäre Datei schreiben & dann atomar umbenennen.
nezzcarth
User
Beiträge: 1760
Registriert: Samstag 16. April 2011, 12:47

Wie lädt die Kamera die Fotos auf den Rechner? Ist das auch ein Skript, das du geschrieben hast? Falls ja, würde ich da ansetzen: Kopier die Datei zunächst in eine temporäre Datei (und/oder in einen anderen Ordner) und erst wenn sie vollständig übertragen ist, benennst du sie richtig (und verschiebst sie ggf. an die korrekte Stelle). Nach dem Prinzip arbeiten auch viele Browser, Download-Tools usw. [edit: sie auch __deets__ Beitrag]

Falls du wirklich die Dateien verifizieren möchtest, wird es schwieriger; im einfachsten Fall könnte man schauen, ob libmagic reicht -- ich bezweifle es aber eher, da libmagic primär nach Magic numbers am Dateianfang sucht. Stattdessen müsstest du dich wohl eingehender mit den Spezifika des JPG-Formats befassen.

Übrigens: Falls auf dem Server Systemd zum Einsatz kommt, könntest du statt eines Cron-Jobs auch eine Path-Unit verwenden. Path-Units werden aktiviert, sobald sich etwas in einem Pfad ändert und sind eine Alternative zu icron & co.
BruderB
User
Beiträge: 3
Registriert: Freitag 16. März 2018, 13:02

Moin __deets__ und nezzcarth,
hallo Liste,

vielen Dank für Eure Gedanken. Also werde ich mich mit der Problematik zunächst außerhalb des Python-Skripts beschäftigen. Es handelt sich um ein NextCloud-WebDAV-Verzeichnis. Mal sehen, ob die Kollegen einen Trigger für die vollständig angekommene Datei auswerfen können.

Grüße,

B.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1236
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Wenn ich Dateien herunterlade und bis auf das letzte Bit mit 99,9999% Wahrscheinlichkeit feststellen möchte, dass es der gleiche Inhalt ist (bis auf die Kollisionen), nutze ich Hashalgorithmen: md5 und sha256
Das setzt aber voraus, dass diese Dateien mit Checksummen sich bereits auf der Quelle befinden. Ist aber nicht so, also muss man sich auf das verlassen, was man hat.
Das ist der Pfad und die Dateigröße und ggf. noch andere Metainformationen.

Vergleiche einfach die Dateigröße nach jedem Download.

(jaja, rsync kann das auch, aber ich denke drum geht es nicht)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@BruderB: WebDAV ist nur ein dünner Wrapper, der einfache Dateioperationen über eine Web-Schnittstelle zur Verfügung stellt. Die Frage ist also die selbe, egal ob jetzt lokal ein Programm die Datei kopiert oder irgendein entferntest Programm über WebDAV.

Ich würde mich auch nicht darauf verlassen, dass Dein WebDAV-Server irgendwelche Besonderheiten hat, das vollständige Übertragen von Daten zu erkennen.
Letztlich kommt es darauf an, ob die Bilddatei fehlerfrei lesbar ist.

Um die Mehrfachverarbeitung von Dateien zu verhindern, kann man den Dateinamen samt Dateigröße speichern und mit der Liste aktueller Dateien vergleichen. Sollte sich die Dateigröße geändert haben, heißt das, dass ein Upload noch im Gange ist.
Das kann man also auch zum ersten Check benutzten:
1. alle Dateien mit Dateigröße sammeln und die bereits bearbeiteten Dateien anhand von Name und Größe ausfiltern.
2. 3 Sekunden warten.
3. aktuelle Dateigröße mit gesammelter Größe vergleichen, bei Änderung Datei als "noch im Upload befindlich" verwerfen.
4. alle restlichen Dateien verarbeiten.

Das verhindert auch, dass kaputte Dateien ständig neu versucht werden, weil sich ja bei kaputten Dateien die Dateigröße nicht mehr ändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14044
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei der verwendete WebDAV tatsächlich eine Besonderheit hat: nach dem erfolgten Upload sollte die Datei in der Datenbank von NextCloud auftauchen. Und eventuell kann man sich ja auch irgendwie in NextCloud einklinken und sich bei neuen Dateien benachrichtigen lassen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
BruderB
User
Beiträge: 3
Registriert: Freitag 16. März 2018, 13:02

Danke nochmal an Euch für die Vorschläge und Ideen!
Antworten