当前位置:主页>仓库管理软件> 列表

delphi转换的byte数组,发送到webservice

企业管理软件版1楼: 分两步
第一步,把文件转换到BYTE数组,保存到数据库
这儿是DELPHI7的代码,转换成的数组再转换成文件也没有问题
procedure TFrmMAIN.Button2Click(Sender: TObject);
var sm:TMemorystream;
byt:ArrayOfbyte;//ArrayOfbyte = array of of byte; 这是用WSDL转换得到的,
icount:integer;
main_Service:MainService;
begin
main_Service:=getMainService;
sm := TMemorystream.Create;
sm.LoadFromFile(''.\chimes.wav'');
iCount := sm.size;
setlength(byt,iCount);
sm.Read(byt[0],iCount);
main_Service.saveBinaryFile(''171'',byt);
end;

这是JAVA写的 webservice的存储BTYE叔祖的代码,后台数据库书SQL2000
public boolean saveBinaryFile(String acct_id, byte[] image) {
FUserImage userImage = new FUserImage();
Session s = null;
boolean rs = false;
Transaction tx = null;
try {
s = HibernateUtil.currentSession();
tx = s.beginTransaction();
userImage.setAcctId(acct_id);

userImage.setFilesize(new Integer(image.length));
System.out.print("================================1"+image.length) ;
userImage.setFilebin(image);
System.out.print("================================2"+image) ;
s.save(userImage);
tx.commit();
HibernateUtil.closeSession();
rs = true;
}
catch (HibernateException ex) {
rs = false;
}
return rs;
}

第2步,从数据库里取回BYTE数组,转换成文件
从webservice 返回一个BYTE数组速度特别慢,我一次都没下载下了
com.thtf.ezone.ezhms.reservation.tables.FUserImage@f77511
下面是webservice 的一段代码
public FUserImage getUserImage(String agr) {
Session s = null;
FUserImage rt = null;//这个对象包含了帐号、文件长度和一个BYTE数组

try {
s = HibernateUtil.currentSession();
Query q = s.createQuery(agr);
List rs = q.list();
if (rs.size() > 0) {
rt = (FUserImage) rs.get(0);
System.out.print(rt)
//这个是打印到TOMCAT的内容表示webservice已经得到了一个对象
;com.thtf.ezone.ezhms.reservation.tables.FUserImage@f77511

}
HibernateUtil.closeSession();
}
catch (HibernateException ex) {
return null;
}

return rt;
}
下面是DELPHI7的一段代码
function getBinaryFile(acct_id:String):boolean;
var
sm:TMemorystream;
byt:ArrayOfbyte;
icount:integer;
main_Service:MainService;
userImage:FUserImage ;
begin
main_Service:=getMainService;
userImage:=FUserImage.Create ;
userImage:=main_Service.getUserImage(''from FUserImage where acct_id=''''''+acct_id+'''''''');
//在这儿就停止不动了,我等了一小时,但是程序没有死,这是为什么呢?

setlength(byt,userImage.filesize);
byt:=userImage.filebin ;
iCount := sizeof(byt);
sm := TMemorystream.Create;
sm.SetSize(iCount);
sm.Write(byt[0],icount);
sm.SaveToFile(''.\bbb123.bmp'');
end;

2楼: 帮我想想办法 如金蝶财务软件论坛

3楼: 如果解决不了,我只好用WebBrowser这个控件了,大家帮我想想法吧

4楼: 速度慢有两点原因.
1.文件本来就比较大
2.Delphi的Webservice对字节数组支持效率非常低.可以参考李维的那本Delphi WebService书.
给你的具体解决方案就是先用Delphi的Zlib压缩.这样体积通常会变为原来的好几分之一.然后转换成Base64编码形式的文本,避免了直接在WebService中传递字节数组的效率低下问题.当然转变为Base64文本体积会再度增大1/3左右.但整体还是比原始数据小好多倍.数据到了对面同样也要有一个解码的过程.先解码Base64,然后解压缩.
这个也是李维提高Webservice效率的推荐方案.

用Delphi自带的Zlib压缩网上多的是,我就不介绍了.Base64也很简单就是引用EncdDecd单元,里面那些EncodeXXX方法就是转变成Base64编码;DecodeXXXX方法就是解码.
这个方案我也一直在用.

5楼: 我用的是JAVA的webservice,我的目的是为了存客户照片,不会大于80K的,
应该不是文件大的原因,我试了一个20多K的文件可一个200多K的文件,上传非常快,
几乎不用等待,数据库里面也可以看到这些二进制码,DELPHI7好象提供了TXSHexBinary增
加了AsByteArray属性的二进制叔祖的解决办法,可以在XML和本地类型之间轻松转换,不知道有没有人用过,类似的有TXSDecimal、TXSDateTime我已经用过了,网上也找不到TXSHexBinary相关资料和用法

6楼: 我用这段话可以在服务端把文件正确保存
try {
java.io.FileOutputStream out=new java.io.FileOutputStream(acct_id+".bmp");
out.write(image);
out.close();
}
catch (IOException ex1) {
System.out.print(ex1) ;
}

是不是这儿懂JAVA的人少啊,要不是有DELPHI部分我也不到这里来发了