Проблема, с которой я имею дело, связана с обработкой двоичных файлов, особенно файлов WAV. Пример кода для текстовых файлов работает как шарм – я могу без проблем подключаться к FTP, загружать и загружать файлы. Однако когда дело доходит до загрузки WAV-файлов, полученный звук звучит искаженно.
В ходе дальнейшего расследования я обнаружил, что пробелы (0x20) в исходном файле на FTP-сервере (с именем message2.wav) преобразуются в 0x0D в загруженной версии (назовем ее DownloadedStepByStep.wav).
Я поделился файлами для справки здесь . Спасибо за понимание!
Вот полный исходный код, который немного изменен (учетные данные FTP удалены):
import 'dart:ffi';
import 'dart:io';
import 'dart:typed_data';
import 'package:ftpconnect/ftpconnect.dart';
import 'dart:convert' show Encoding, LineSplitter, Utf8Codec, Utf8Decoder, Utf8Encoder, utf8;
void main() async {
final FTPConnect _ftpConnect = new FTPConnect( "ftp.xxxxxx.com", user: "[email protected]", pass: "xxxxx", showLog: true , port: 21 );
///an auxiliary function that manage showed log to UI
Future<void> _log(String log) async {
print(log);
await Future.delayed(Duration(seconds: 1));
}
///mock a file for the demonstration example
const X=<int>[]; // added by me as input of List<int> to function below
Future<File> _fileMockwav({fileName = 'FlutterTest.wav' , content =X }) async {
final Directory directory = Directory('/test')..createSync(recursive: true);
final File file = File('${directory.path}/$fileName');
await file.writeAsBytes(content ); // changed by me
return file;
}
Future<void> _downloadStepByStep() async {
try {
await _log('Connecting to FTP ...');
await _ftpConnect.connect();
await _log('Downloading ...');
String fileName = '../message2.wav';
//here we just prepare a file as a path for the downloaded file
File downloadedFile = await _fileMockwav(fileName: 'DownloadedStepByStep.wav');
await _ftpConnect.downloadFile(fileName, downloadedFile);
await _log('file downloaded path: ${downloadedFile.path}');
await _ftpConnect.disconnect();
} catch (e) {
await _log('Downloading FAILED: ${e.toString()}');
}
}
await _downloadStepByStep();
}
Wav-файл не должен быть искажен, а преобразование пробелов в 0x0d является проблемой. Понятия не имею, как избежать этого преобразования...
Эти пустые места в Beyond Compare не являются пробелами (я не вижу 20
). Это недостающие байты [по сравнению с левой частью]. Различия заключаются в том, что 0A
(LF) [справа] преобразуется в 0D
+0A
(CRLF) [слева] – признак перехода в текстовый режим .
Я не знаю ни Flutter, ни Dart, но кажется, вам нужно вызвать FTPConnect.setTransferType
с помощью TransferType.binary
:
_ftpConnect.setTransferType(TransferType.binary);