Я работаю с TIdHTTPServer
для предоставления файлов клиентам, используя функцию ResponseInfo->ServeFile
. Это отлично работает для файлов, которые являются «статическими»: они не записываются каким-либо другим процессом. Насколько я вижу из кода, функция ServeFile внутри использует TIdReadFileExclusiveStream
, что не позволяет мне читать записываемый файл, но мне нужно также иметь возможность отправлять файлы, которые записываются каким-то другим процессом.
Итак, я перешел к созданию FileStream самостоятельно и использовал свойство ContentStream
, чтобы вернуть его клиенту, но я получаю в клиенте файл размером 0 байт (для любого файла, записываемого или нет), и я не вижу, что я упускаю или делаю неправильно. Вот код, который я использую в обработчике событий OnCommandGet
:
AResponseInfo->ContentStream = new TFileStream(path, fmOpenRead | fmShareDenyNone);
AResponseInfo->ContentStream->Position = 0;
AResponseInfo->ContentLength = AResponseInfo->ContentStream->Size;
AResponseInfo->ResponseNo = 200;
AResponseInfo->WriteHeader();
AResponseInfo->WriteContent();
Свойство ContentLength в этот момент имеет допустимое значение (т. е. размер файла при вызове ContentStream->Size), и это то, что я хотел бы отправить клиенту, даже если файл изменится между ними.
Я попытался удалить функцию WriteContent(), WriteHeader(), но результаты те же. Я искал несколько примеров, но те немногие, что я нашел, более или менее совпадают с этим кодом, поэтому я не знаю, что не так. Большинство примеров не включают вызов WriteContent(), поэтому я попытался удалить их, но, похоже, нет никакой разницы.
В качестве примечания: для завершения записи файлов требуется 24 часа, но этого следует ожидать со стороны клиента: мне просто нужны байты, уже записанные на момент запроса (даже несколько меньше допустимо). Файлы никогда не будут удалены: они просто будут увеличиваться в размерах.
Любые идеи?
Обновить
Используя Fiddler, я получаю некоторые предупреждения о нарушениях протокола, которые могут быть связаны с этим. Я получаю, например:
Content-Length mismatch: Response Header indicated 111,628,288 bytes, but server sent 41 bytes
Длина содержимого правильная, это размер файла, но я не знаю, что я делаю неправильно, из-за чего приложение отправляет всего 41 байт.