2

ファイルを転送するために TStream オブジェクトを返す DataSnap サーバー メソッドを作成しました。クライアント アプリケーションはメソッドを呼び出し、ストリームを読み取ってファイルをダウンロードします。サーバー メソッドは非常に単純です。

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

多くの種類のファイル (PDF、GIF、BMP、ZIP、EXE) のダウンロードには問題なく機能しますが、JPG ファイルのダウンロードには機能しません。クライアント側では、メソッド呼び出しから返されるストリーム オブジェクトのサイズは、JPG では常に 0 です。PC でローカルに JPG ファイルを正常にストリーミングできるので、DataSnap と関係があるに違いありません。DataSnap がバックグラウンドでストリームを JSON に変換することを示唆するいくつかの調査を行いましたが、JPG ファイルに関してはこれに問題がある可能性があります - 誰でもこれを確認できますか? クライアント側では、TDSRESTConnection を使用してサーバー メソッドを呼び出しています。ストリーミングの前に JPG ファイルを ZIP できることはわかっていますが、そうする必要はありません。

4

4 に答える 4

3

これを解決するためにスレッドを更新すると思いました。TStreamを使用してDataSnapを介してJPEGファイルを転送する方法を見つけたことはありませんが、ストリームを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をダウンロードするための新しいサーバーメソッド呼び出しとして作成しました。TStreamの代わりにTJSONArrayを使用してファイルを転送すると、4倍も遅くなることがわかったため、他のすべてのファイルタイプには元のメソッドを使用します。

于 2012-02-09T16:58:12.767 に答える
1

Embarcadero は、この問題 (.DOC ファイルにも影響します) の修正を行いました。

1.「...\RAD Studio\9.0\source\data\datasnap\Datasnap.DSClientRest.pas」を DataSnap クライアント プロジェクト フォルダにコピーします。

2..pas ファイルをプロジェクトに追加します。

3. Line#1288 を以下のように修正します。

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

4.DataSnap REST クライアント プロジェクトの再構築

5.RESTサーバーで実行する

これで問題は解決しました。

于 2012-04-03T09:36:06.363 に答える
1

アップデートとして - さらに調査した結果、これは PC で使用されているシステム ロケールに関連していることがわかりました。「English (United Kingdom)」を使用していますが、これをたとえば「Japan (Japanese)」に変更すると、エラーがなくなり、ファイル転送が正常に機能します。これを Embarcadero の QC レポートとして記録しました。

于 2012-03-26T09:06:28.627 に答える
1

次の行を DownloadFile メソッドに追加します。

GetInvocationMetadata.ResponseContentType := 'image/jpeg';
于 2015-05-04T07:14:31.533 に答える