2012-02-03 74 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'; 
相关问题