2012-02-03 42 views
2

我已經編寫了一個DataSnap服務器方法,該方法返回一個TStream對象來傳輸文件。客戶端應用程序調用該方法並讀取流以下載文件。服務器的方法很簡單:Delphi XE2 DataSnap - 通過TStream將JPEG文件從服務器流式傳輸到客戶端

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。我可以在PC上本地成功傳輸JPG文件,因此它必須與DataSnap有關。我已經做了一些研究,建議DataSnap在後臺將流轉換爲JSON,並且在涉及到JPG文件時可能會遇到問題 - 任何人都可以證實這一點?在客戶端,我使用TDSRESTConnection來調用服務器方法。我意識到我可以在流式傳輸前壓縮JPG文件,但寧可不必這樣做。

回答

1

Embarcadero公司現在已經回來了修復這個問題(這也影響.DOC文件):

1.複印」 ... \ RAD Studio在\ 9.0 \源\數據\的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客戶親ject

5.運行REST服務器

解決了這個問題。

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; 

然後在客戶端我重新轉換爲T流有:

strFileStream := TDBXJSONTools.JSONToStream(JSONArray); 

我已經下載的JPEG創造了這個作爲一個新的服務器方法調用純,因爲我發現使用TJSONArray而不是TStream傳輸文件的速度要慢4倍,所以我使用我的原始方法處理所有其他文件類型。

1

就像更新 - 經過深入研究,我發現這與PC上使用的系統區域設置有關。我使用的是「英語(英國)」,但如果我將其更改爲例如「日本(日語)」,那麼錯誤消失,文件傳輸工作正常。我已經將這個記錄作爲Embarcadero的QC報告。

0

此行添加到您的DownloadFile方法:

GetInvocationMetadata.ResponseContentType := 'image/jpeg'; 
相關問題