kbmmw 的HTTPSmartService 上传文件到服务器端

Posted Delphi 窑洞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kbmmw 的HTTPSmartService 上传文件到服务器端相关的知识,希望对你有一定的参考价值。

前面我写过了 HTTPSmartService 使用介绍,可以参见以前的文章。

前一向有同学问如何在http 页面表单上上传文件。一直没有时间回答,自己简单做了例子,

发现无法实现功能,今天花了一天时间,发现了几个坑,终于填平了。

主要原因是kbmmw 本身有点小问题,要小修改一下,注意,我使用的版本是 kbmmw 5.6.20

 修改kbmMWHTTPUtils.pas 内容如下:

function TkbmMWHTTPMultiPart.GetAsBytes:TBytes;
var
   p:PByte;
   i:integer;
begin
     SetLength(Result,FDataLength);
     p:=PByte(FOwner.FStream.Memory);
     inc(p,FDataOfs);
     Move(p^,Result[0],FDataLength);


end;

function TkbmMWHTTPMultiPart.GetAsString:string;
begin
    Result:=TkbmMWPlatformMarshal.UTF8Decode(GetData,FDataLength);
end; 

准备工作做完了。现在开始例子。

首先我们把上次的html 页面改成可以上传文件的格式

<body>
<table width="770" border="0" align="center" cellpadding="0" cellspacing="0" class="unnamed2">
  <tr>
       
    <td width="848" align="center"><span class="style1">北京美语学院2009年新生录取查询</span><br></td>

  </tr>
  <form name="form1" method="post" action="/xalionrest/postfile" enctype="multipart/form-data" >
  <tr>
    <td align="center">
             <span class="style2">姓名:</span>          <input name="xsxm" type="text" id="xsxm">
           <span class="style2">身份证号:</span>          <input name="sfzh" type="text" id="sfzh">
           <span class="style2">文件上传:</span>            <input type="file" id="MyUpload" name="MyUpload">
     </td>
  </tr>
  
  <tr>

    <td align="center">
      <br>
      <input type="submit" name="Submit" value="提交" onClick="return B1_onclick()">        
      <input type="reset" name="Submit" value="重置">
    </td>
  </tr>
 </form> 
</table>
<br>
<table width="770" border="0" align="center" cellpadding="0" cellspacing="0" class="unnamed3">
  <tr>

    <td></td>
  </tr>
</table>
<br>

<br>
<table width="770" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td align="center"><a href="/web/lqcx">返回查询页面</a></td>
  </tr>
</table>

</body>

里面加入了文件上传的部分。

用浏览器打开,如下图

输入文件的地方也显示出来了。

对应服务器上的代码如下:

  [kbmMW_Rest(\'method:post, path:postfile\')]
     [kbmMW_Method]
     function postfile:string;
//---------------------------------------------------------//

function TkbmMWCustomHTTPSmartService1.postfile: string;
var
  mp: TkbmMWHTTPMultiParts;
  bd,s,xsxm,sfzh:string;

  sname:string;
   f:TkbmMWHTTPMimeHeaderValueFields;

  p:Tbytes;
  hlp:TkbmMWHTTPTransportStreamHelper;
  I,fsize: Integer;

  fs:Tfilestream;
begin

    hlp:=TkbmMWHTTPTransportStreamHelper(RequestTransportStream.Helper);

   f:=hlp.Header.ValueFields[\'Content-Type\'];
   if f=nil then
      exit;

   bd:=f.ValueByName[\'boundary\'];
    if bd=\'\' then
      begin
       result:=\'can\'\'t find file!\';
        exit;
      end;


    mp:=TkbmMWHTTPMultiParts.Create(RequestStream,bd);


   for I := 0 to mp.Count-1 do
     begin

      f:=mp.Parts[i].Headers.ValueFields[\'Content-Disposition\'];

       sname:= kbmMWRemoveQuotes( f.ValueByName[\'name\']);
       if sname=\'xsxm\'   then
          begin

          xsxm:=  mp.Parts[i].AsString;;
          end;

       if sname=\'sfzh\' then

          sfzh:=mp.Parts[i].AsString;

       if sname=\'MyUpload\' then
           begin

             fs:= Tfilestream.Create(\'d:\\\'+kbmMWRemoveQuotes(f.ValueByName[\'filename\']) ,fmCreate+fmOpenWrite);
             fsize:= mp.Parts[i].Size;

             mp.Parts[i].SaveToStream (fs);

             fs.Free;

           end;

     end;


    result:=\'姓名:\'+xsxm+\'      身份证号:\'+sfzh +\'文件大小:\'+fsize.ToString;

     SetResponseMimeType(\'text/html\');


end;

 

运行起来。

输入相应的数据,选择一个文件。

点击提交。

浏览器就返回正常信息,同时也在对应目录生成上传的文件。

实现需要的功能。

 

以上是关于kbmmw 的HTTPSmartService 上传文件到服务器端的主要内容,如果未能解决你的问题,请参考以下文章

使用nginx 做kbmmw REST 服务的负载均衡

使用kbmmw 的调度事件动态显示时间

REST easy with kbmMW #20 – OpenAPI and Swagger UI

第一个kbmmw for Linux 服务器

kbmmw 与extjs 通过JSON Base64 显示图片

使用kbmMW调试内存泄漏