前面我写过了 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[],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 := to mp.Count- 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 上传文件到服务器端的更多相关文章

  1. WebClient 上传文件 上传文件到服务器端

    一直对于上传文件到服务器端困惑:以前,现在,学到了关于WebClient的post知识 瞬间对于上传文件到服务器觉得好轻松: 原理很简单:我们通过post服务器的页面:把本地的文件直接传递过去: 现在 ...

  2. OkHttp上传文件,服务器端请求解析找不到文件信息的问题

    长话短说,不深入解释了,官方给的上传案例代码: private static final String IMGUR_CLIENT_ID = "..."; private stati ...

  3. 那些年的 网络通信之 TCP/IP 传输控制协议 ip 加 端口 客户端上传文件到服务器端服务器端返回上传成功消息

    多线程开启, 客户端通过 Socket 流 上传文件到服务端的一个小程序练习. 1. 抓住阻塞式方法,去调试 2. 获取对应流对象操作对应的对象 这时候自己不能懵,一定要清晰,最好命名就能区别,一搞混 ...

  4. 关于FileZilla上传文件后服务器端文件与本地文件大小不一致的解决方法

    最近在调试网站时发现,通过ftp上传工具FileZilla上传至服务器端的文件与本地文件大小不一致,虽然没有影响网站的最终显示效果,但仍让我困惑不解.后发现是传输类型的原因,解决方法如下: 中文版Fi ...

  5. 上传文件到服务器端后进一步推送到sftp服务器

    扩展安装 要想sftp服务端发送文件,就需要php脚本具有作为ssh客户端的能力,所以需先为php安装如下扩展 openssl openssl-dev libssh php ssh 扩展 按照下面的命 ...

  6. 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子

    客户端:先创建一个winform窗体的应用程序项目 项目结构

  7. Android 上传文件,图片。以及服务器端接收相关。

    前面一篇文章写了实现照相功能的一个例子,其实那个实现效果是个略缩图.要查看全图就要先指定照片的存放路径.以后我会修改那个文章.今天先说下图片,文件等上传的实现.接着拿照片说事,光照完了不行还得往服务器 ...

  8. node.js服务器端下载、上传文件

    使用request 下载文件: 安装依赖: npm i requestsourceUrl下载源,targetUrl保存路径 async function downLoadFile(sourceUrl, ...

  9. 鸿蒙的js开发部模式18:鸿蒙的文件上传到python服务器端

    1.首先鸿蒙的js文件上传,设置目录路径为: 构建路径在工程主目录下: 该目录的说明见下面描述: 视图构建如下: 界面代码: <div class="container"&g ...

随机推荐

  1. CentOS 7 单用户模式+救援模式

    CentOS 7 单用户模式+救援模式 CentOS 7 单用户模式+救援模式.有时候大家可能会忘记自己的root密码,或者错误(命令输入错误,命令位置输入有误等)编辑了一个/etc目录下的核心文件导 ...

  2. Shell教程 之变量

    1.Shell变量 1.1 定义变量 your_name="http://www.cnblogs.com/uniquefu" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有 ...

  3. Python+Selenium学习--打印当前页面的title及url

    场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例,所谓用例不够,title来凑就是这个道理.更具体一点,假设1个页面的title应该是'hello world', 那么可以 ...

  4. 两种方法修改pyhton爬虫的报头

    方法一: import urlib.request url = "" headers=("User-Agent","") opener = ...

  5. UNITY3D 2D物流流体插件下载|Liquid Physics 2D

    制作类似<鳄鱼小顽皮爱洗澡>游戏的必备插件 下载地址: https://item.taobao.com/item.htm?spm=0.7095261.0.0.47411debZFbEUn& ...

  6. java Scanner类注意事项

    1,循环或递归调用获取数字时,不能用hasNextInt()判断是否有输入,不然会陷入死循环,应该用hasNext().获取也不能用nextInt(),应用next(),否则也会死循环 例如这段代码, ...

  7. mysql 数据库备份的多种方式

    一.使用mysqldump进行备份 1.完整备份所有数据库 mysqldump -u root -p --all-databases > E:/all.sql 在mysql8之前,存储过程和事件 ...

  8. [z] Git pull 强制覆盖本地文件

    git fetch --all git reset --hard origin/master git pull git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEA ...

  9. [z]c++ 和 java 利用protobuf 通讯

    [z]http://andinker.iteye.com/blog/1979428  java端的具体步骤如下: 1.首先下载 下载protobuf 编译工具   http://code.google ...

  10. netcore sqlserver linq contains生成的sql语句不是使用like而是charIndex

    在ef中使用linq调用了contains,结果怎么都查不到值,打开sqlserver profiler 发现生成的sql语句不是使用like...而是CharIndex 参考文档:https://s ...