如何通过Webservice传输一个文件(例如XML) ( 积分: 100 )

  • 主题发起人 主题发起人 METALLEE
  • 开始时间 开始时间
M

METALLEE

Unregistered / Unconfirmed
GUEST, unregistred user!
需求是这样的,Webservice服务端访问数据库,将结果保存到XML中,传到客户端然后解析。最开始是将XML的文本通过Widestring传到客户端,但是发现如果数据结果中包括中文字符且中文字符是奇数个的时候就会无法解析XML(Widestring的长度比较长,一般都是好几千的长度)估计是string-->widestring-->string的时候出现了问题。现在想换个思路。不通过类型转换而是直接将XML数据流传输过来,请问Webservice传输数据流的时候需要将其单独封装成一个类吗?顺便问问string-->widestring-->string如何转换最安全?(大数据量的文字,中英文混和)
 
需求是这样的,Webservice服务端访问数据库,将结果保存到XML中,传到客户端然后解析。最开始是将XML的文本通过Widestring传到客户端,但是发现如果数据结果中包括中文字符且中文字符是奇数个的时候就会无法解析XML(Widestring的长度比较长,一般都是好几千的长度)估计是string-->widestring-->string的时候出现了问题。现在想换个思路。不通过类型转换而是直接将XML数据流传输过来,请问Webservice传输数据流的时候需要将其单独封装成一个类吗?顺便问问string-->widestring-->string如何转换最安全?(大数据量的文字,中英文混和)
 
李维的书里有讲
服务端
function TWavsService.GetWavFile(const sFileName: String): String;
var
ams : TMemoryStream;
ass : TStringStream;
begin
Result := '';
if (FileExists(sAppPath + 'wavs/' + sFileName)) then
begin
ams := TMemoryStream.Create;
ams.LoadFromFile(sAppPath + 'wavs/' + sFileName);
ass := TStringStream.Create('');
try
MimeEncodeStream(ams, ass);
Result := ass.DataString;
finally
ass.Free;
ams.Free;
end;
end;
end;
客户端
procedure TForm2.bbtnPlayWavClick(Sender: TObject);
var
aIntf : IWavsService;
ass : TStringStream;
ams : TMemoryStream;
sWav : String;
sFileName : String;
begin
aIntf := HTTPRIO1 as IWavsService;
try
sFileName := lbWavs.Items[lbWavs.ItemIndex];
sFileName := GetWavFileName(sFileName);
sWav := aIntf.GetWavFile(sFileName);
ams := TMemoryStream.Create;
ass := TStringStream.Create(sWav);
MimeDecodeStream(ass, ams);
ams.SaveToFile(sFileName);
Self.MediaPlayer1.FileName := sFileName;
Self.MediaPlayer1.Open;
Self.MediaPlayer1.Play;
finally // wrap up
ass.Free;
ams.Free;
aIntf := nil;
end
// try/finally
end;
 
樓上講得對,將你的一切數據進行編碼後,以字符串形式傳送。

最好是BASE64編碼
 
李维的webService/SOAP书上有。
 
问题解决,结贴,谢谢大家
 
MimeEncodeStream
MimeDecodeStream
属于哪个单元?
 
后退
顶部