storeFile method
Implementation
Future<void> storeFile(String filename) async {
if (!await openDataConnection()) {
return;
}
File? file;
IOSink? fileSink;
try {
String fullPath = fileOperations.resolvePath(filename);
transferInProgress = true;
// Create the directory if it doesn't exist
final directory = Directory(fullPath).parent;
if (!await directory.exists()) {
await directory.create(recursive: true);
}
file = File(fullPath);
fileSink = file.openWrite();
// Handle socket errors during file upload
dataSocket!.listen(
(data) {
if (transferInProgress) {
try {
fileSink?.add(data);
} catch (e) {
logger.generalLog('Error writing to file: $e');
_handleTransferError(fileSink);
}
}
},
onDone: () async {
if (transferInProgress) {
try {
await fileSink?.flush();
await fileSink?.close();
transferInProgress = false;
await _closeDataSocket();
sendResponse('226 Transfer complete');
logger
.generalLog('File transfer complete: $filename to $fullPath');
} catch (e) {
logger.generalLog('Error closing file after transfer: $e');
_handleTransferError(fileSink);
}
}
},
onError: (error) async {
logger.generalLog('Socket error during file upload: $error');
_handleTransferError(fileSink);
},
cancelOnError: true,
);
} catch (e) {
logger.generalLog('Exception in storeFile: $e');
sendResponse('550 Error creating file or directory: $e');
transferInProgress = false;
fileSink
?.close()
.catchError((e) => logger.generalLog('Error closing file sink: $e'));
await _closeDataSocket();
}
}