Ich implementiere einen benutzerdefinierten sftpServer mit Paramiko. Ziel des Servers ist es, MP4-Dateien von Clients (NVR-Kameras) zu empfangen. Sobald die Dateiübertragung abgeschlossen ist, führen Sie Nachbearbeitungsaktionen wie die Umbenennung der Datei und das Hochladen in Cloud-Speicher durch. Stat oder lstat unmittelbar nach öffnen rufen, was mit "keine solche Datei oder Verzeichnis" fehlschlagen kann, da die Datei möglicherweise noch nicht auf der Festplatte vorhanden ist oder noch leer ist. Dies schafft Unsicherheit darüber, wann es sicher ist, meine Nachbearbeitungslogik auszulösen. PrettyPrint-Override ">
Code: Select all
# In my SFTPInterface class
def open(self, path, flags, attr):
# ... path validation and directory creation logic ...
realpath = self._get_real_path(path)
try:
# Open a low-level file descriptor
fd = os.open(realpath, flags, 0o664)
# Create a Python file object from the descriptor
fileobj = os.fdopen(fd, "wb") # Assuming binary write mode
handle = SFTPFileHandle(flags, file_path=realpath)
handle.writefile = fileobj
logger.info(f"File opened for writing: {realpath}")
return handle
except OSError as e:
logger.error(f"Failed to open file {realpath}: {e}")
return paramiko.SFTP_FAILURE
Mein aktueller Ansatz ist es, die Nachbearbeitungsaktionen in der Methode schließen meines benutzerdefinierten sftpFileHandle auszuführen. Vor dem Hochladen überprüfe ich os.path.exists () und os.path.getSize () , um zu bestätigen, dass die Datei tatsächlich geschrieben wurde.
Code: Select all
# In my SFTPFileHandle class
def close(self):
logger.info(f"Close called for file: {self.file_path}")
# First, call the parent close to ensure buffers are flushed
super().close()
if os.path.exists(self.file_path) and os.path.getsize(self.file_path) > 0:
logger.info(f"File {self.file_path} exists and is not empty. Proceeding with upload.")
# ... call my rename_file() and upload_file() logic here ...
else:
logger.warning(f"File {self.file_path} not found or is empty after close.")
return paramiko.SFTP_OK
< /code>
ist der [b]close()
[/b] Methode der SFTPFileHandle Der richtige und garantierte Ort, um diese postschreiberen Operationen auszuführen, mit der Annahme, dass bis zum Zeitpunkt Super (). Close () aufgerufen wurde, wurden alle Daten des Kunden erfolgreich geschrieben und zum Objekt des zugrunde liegenden Dateien auf dem Datei-Dateisystem des Servers gespült? Oder gibt es eine andere Methode oder ein anderes Muster in der Paramiko SFTPServer -Rinformace, die für diesen Zweck besser geeignet ist?