Delphi XE2 DataSnap - потоковая передача файлов JPEG через TStream с сервера на клиент - PullRequest
2 голосов
/ 03 февраля 2012

Я написал метод сервера DataSnap, который возвращает объект TStream для передачи файла. Клиентское приложение вызывает метод и читает поток для загрузки файла. Метод сервера очень прост:

function TServerMethods.DownloadFile(sFilePath: string): TStream;
var
  strFileStream: TFileStream;
begin
  strFileStream := TFileStream.Create(sFilePath, fmOpenRead);
  Result := strFileStream;
end;

Он отлично работает, загружая файлы многих типов (PDF, GIF, BMP, ZIP, EXE), но не работает при загрузке файлов JPG. На стороне клиента объект потока, возвращаемый из вызова метода, всегда имеет размер 0 с JPG. Я могу успешно передавать файлы JPG локально на моем ПК, поэтому это должно быть как-то связано с DataSnap. Я провел некоторое исследование, которое предполагает, что DataSnap преобразует поток в JSON за кулисами, и может возникнуть проблема с этим, когда дело доходит до файлов JPG - кто-нибудь может это подтвердить? На стороне клиента я использую TDSRESTConnection для вызова метода сервера. Я понимаю, что мог бы сжать файлы JPG перед потоковой передачей, но лучше не делать этого.

Ответы [ 4 ]

3 голосов
/ 09 февраля 2012

Думаю, я обновлю ветку о моих попытках решить эту проблему.Я никогда не находил способ передать файл JPEG через DataSnap с использованием TStream, но сделал это, преобразовав поток в TJSONArray и передав его обратно.Итак, мой метод сервера теперь выглядит следующим образом:

function TServerMethods.DownloadJPEGFile(sFilePath: string): TJSONArray;
var
  strFileStream: TFileStream;
begin
  strFileStream := TFileStream.Create(sFilePath, fmOpenRead);
  Result := TDBXJSONTools.StreamToJSON(strFileStream, 0, strFileStream.Size);
end;

, затем на стороне клиента я преобразую обратно в TStream с помощью:

strFileStream := TDBXJSONTools.JSONToStream(JSONArray);

Я создал это как новый вызов метода сервераисключительно для загрузки JPEG, поскольку я обнаружил, что передача файлов с использованием TJSONArray вместо TStream в 4 раза медленнее, поэтому я использую свой оригинальный метод для всех других типов файлов.

1 голос
/ 03 апреля 2012

Embarcadero теперь вернулся с исправлением этой проблемы (которая также влияет на файлы .DOC):

1. Скопируйте '... \ RAD Studio \ 9.0 \ source \ data \ datasnap \ Datasnap.DSClientRest.pas 'в папку проекта клиента DataSnap

2.Добавьте файл .pas в проект

3. Модифицируйте строку # 1288, как показано ниже

//  LResponseJSON := TJSONObject.ParseJSONValue(BytesOf(LResponseText.StringValue), 0);
LResponseJSON := TJSONObject.ParseJSONValue(BytesOf(UTF8String(LResponseText.StringValue)), 0);

4.Rebuild DataSnap REST Client проект

5. Запустите его с REST Server

Это решит проблему.

1 голос
/ 26 марта 2012

Так же, как обновление - после дальнейших исследований я обнаружил, что это связано с языком системы, используемым на ПК.Я использую «Английский (Великобритания)», но если я изменю его, например, на «Япония (Японский)», ошибки исчезнут, и передача файлов будет работать нормально.Я зарегистрировал это как отчет о контроле качества с Embarcadero.

0 голосов
/ 04 мая 2015

Добавьте эту строку в ваш метод DownloadFile:

GetInvocationMetadata.ResponseContentType := 'image/jpeg';
...