在看本文章前请 参考前面的文章
这篇文章 介绍 flex 如何 在调用delphi datasnap 的Rest服务过程中以 大量的数据为参数 (字节流 )
该方法 在网络上 基本没有资料,废掉了我无数的脑细胞啊,再次 bs emb 帮助太操蛋了
首先 大量的数据不能通过前面的方式 直接写在Rest 地址的后面.
我用了http post 方法
效果如下
这是flex 前台传输到后代的 字节码,后台代码如下
function TSMTest.updateSetBytes(stream:TJSONObject): string;
var
i:integer;
begin
FrmMain.Memo1.Lines.Add('jsonValue:'+(stream.ToString));
end;
主要 是参数为Tjsonobject
前台 主要是传输了一个 jpg的图片
前台代码如下
var fileReference:FileReference = new FileReference();
protected function btnUpLoad_clickHandler(event:MouseEvent):void
{
fileReference.addEventListener(Event.SELECT, onSelect);
fileReference.addEventListener(Event.COMPLETE,onComplete);
//urlRequest = new URLRequest("http://localhost:8666/Ashx/FileHandler.ashx");
browse();
}
private function onSelect(evt:Event):void{
labstate.text="文件:"+fileReference.name+" "+"大小:"+fileReference.size+"字节";
fileReference.load();
}
private function onComplete(evt:Event):void{
imgUpload.source=fileReference.data;
var read :ReadDataFromServer = new ReadDataFromServer();
read.onLoadComplete = onBytesParam;
var barr:ByteArray= fileReference.data;
barr.position =0;
var arr:Array = new Array();
for(var i:int=0;i<barr.length;i++){
arr.push(barr.readUnsignedByte());
}
var ubArr:ByteArray = new ByteArray();
for( i=0;i<arr.length;i++){
ubArr.writeUnsignedInt(arr[i]);
}
var str :String ='{"Array":['+ JSON.encode(arr)+"]}";
read.PostJson('datasnap/rest/TSMTest/SetBytes',str);
///
}
public function onBytesParam(e:Event):void{
}
private function browse():void{
var imageTypes:FileFilter = new FileFilter("图片 (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png");
var allTypes:Array = new Array(imageTypes);
try
{
fileReference.browse(allTypes);
}
catch(e:Error)
{
Alert.show(e.message+"&&"+e.getStackTrace());
}
}
注意
'datasnap/rest/TSMTest/SetBytes'
这个方法,后台必须 在方法名 加上 update 这个头,不知道为什么....
哎摸索上面的方法,真是不容易啊,,再次bs emb 为啥 资料不搞详细点,李维老师的 datasnap 实战 的书籍 中的介绍也 感觉很粗糙......希望李老师能再出几本精品的书籍啊.....