1. 程式人生 > >kbmmw 的HTTPSmartService 上傳文件到服務器端

kbmmw 的HTTPSmartService 上傳文件到服務器端

position nwr header int tput 發現 orm lena 工作

前面我寫過了 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 上傳文件到服務器端