2012-02-03 20 views
2

ファイルを転送するTStreamオブジェクトを返すDataSnapサーバーメソッドを作成しました。クライアントアプリケーションはメソッドを呼び出し、ストリームを読み込んでファイルをダウンロードします。サーバーの方法は非常に簡単です:Delphi XE2 DataSnap - サーバーからクライアントへのTStream経由のJPEGファイルのストリーミング

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

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

答えて

1

エンバカデロは(も.docファイルに影響します)この問題を修正して戻ってきて、今持っている:

1.Copy」... \ RAD Studioの\ 9.0 \ソース\データ\のDataSnapの\ Datasnap.DSClientRest

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

4.RebuildのDataSnap RESTクライアントプロ以下のようにプロジェクトにあなたのDataSnapクライアントのプロジェクトフォルダ

2.Add .PASファイルへ.PAS'

3.Modifyライン#1288 RESTサーバーとJECT

5.Runそれは

これは、問題を修正します。

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にに変換します。私は、JPEGファイルをダウンロードするための純粋に新しいサーバーメソッド呼び出しとしてこれを作成している

strFileStream := TDBXJSONTools.JSONToStream(JSONArray); 

TStreamの代わりにTJSONArrayを使用してファイルを転送すると、4倍も遅くなるので、他のすべてのファイルタイプに対して独自のメソッドを使用します。

1

さらに詳しい調査の結果、これはPCで使用されているシステムロケールに関連していることがわかりました。私は 'English(United Kingdom)'を使用していますが、これをたとえば「日本(日本語)」に変更するとエラーがなくなり、ファイル転送がうまく動作します。私はこれをEmbarcaderoでQCレポートとして記録しました。

0

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

GetInvocationMetadata.ResponseContentType := 'image/jpeg'; 
関連する問題