三层分布式结构下,通过服务器端的Remote Data Module中的函数的参数,是否能够传输图片?
因为对数据表修改后,是通过调用服务器端函数完成保存操作。现在有一字段是image(用户存放图片)类型的,通过什么方法能将图片放在函数的参数中,同其他字段一起传递给服务器?

解决方案 »

  1.   

    To: stoneman1982(骁勇) 
    我用的是位图,图片自身就是二进制的吧,还是需要用函数转换成二进制?如果转成二进制,该用什么类型的变量传递,服务器端用什么类型的变量接收?
      

  2.   

    偶有一段文件流转OleVariant的代码,当初是为了与VB进行文件传送用的,可以参考一下,也是使用的COM。
    =========================================
    procedure ReadFile(const FileName: WideString; var Packet: OleVariant);
    var
      TempStream:TFileStream;
      Param:OleVariant;
      p:Pointer;
    begin
      TempStream:=TFileStream.Create(String(FileName),fmOpenRead);
      try
         Param:=VarArrayCreate([0,TempStream.Size-1],varByte);
         p:=VarArrayLock(Param);
         try
            TempStream.Position:=0;
            TempStream.Read(p^,TempStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         TempStream.Free;
      end;
      Packet:=Param;
    end;
    =========================================
    function WriteFile(var Stream: OleVariant;
      const FileName: WideString): SYSINT;
    var
      OutStream:TFileStream;
      p:Pointer;
    begin
      Result:=-1;
      p:=VarArrayLock(Stream);
      OutStream:=TFileStream.Create(String(FileName),fmCreate);
      try
         OutStream.Write(p^,VarArrayHighBound(Stream,1)+1);
      finally
         VarArrayUnlock(Stream);
         OutStream.Free;
      end;
      Result:=0;
    end;
      

  3.   

    我现在想到几种方法:
    1 将图片流转换成字符串,然后用字符串数组保存字符串(因为图片流转成字符串后包含有#0等特殊字符,传输时字符串会被截断),再传给服务器。但是服务器那端的函数的参数类型中没有普通的数组类型,通常传递数组是用变体数组传递的。若是将字符数组中的每个字符赋给变体数组的每个元素,变体数组会将字符自动转换成字符串保存,这样那些特殊字符(如#0)还是没法传递过去。不知有没有解决的办法?
    2 将转成的字符串中的#0等特殊字符替换成一个特殊的字符串,在服务器端在反向转换一下,很麻烦。
    3 使用IPicture接口,但是我们用的是socket端口,好像IPicture只支持COM连接。
    4 是不是可以将图片对象存在变体中,然后将整个图片传递过去?
    5 如果能够将图片转成二进制格式传输应该没问题,但我不知道如何转换。使用什么函数转换,又该用什么类型的参数变量传递?
    现在就能想到这些办法,还望各位大侠出手指点啊!!!
      

  4.   

    问题解决了。
    先将图片流中的每个字节转换成数字ASCII码,存入整型数组中传递给服务器。再在服务器端将ASCII码转成字符,并连成字符串,赋给image类型的字段。这样图像就保存成功了。