前面我写过了 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. 原生js,通过document.getElementByClassName获取元素的索引值

    let itemList = document.getElementsByClassName('sky-item') // 一行所有元素 let index = 0 for(let i = 0; i& ...

  2. NumPy 迭代数组

    NumPy 迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用 arange() ...

  3. 十个前端UI优秀框架

    最近需要一些前端框架,于是在网上整理了一些感觉不错的前端框架,有pc端和移动端,为了方便日后自己先记录下来了... Bootstrap 首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( ...

  4. 上海大都会赛 I Matrix Game(最大流)

    At the start of the matrix game, we have an N x M matrix. Each grid has some balls.The grid in (i,j) ...

  5. [剑指Offer]52-两个链表的第一个公共节点

    题目链接 https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&t ...

  6. win7安装sqlserver2008

    双击启动程序,点击安装

  7. 本地DNS解析

    企业搭配本地域名,进行解析 2018年07月23日 09:31:46 阅读数:2 搭建dns服务器,可以进行域名解析,这样方便企业项目本地测试. 可以实现,输入域名访问本地服务器 一.安装软件 1.下 ...

  8. php的ob缓存详解

    前言引入 先看下面的代码: 这个代码,每次输出后都有sleep(1),表示程序执行暂定一秒,想象中浏览器应该是每隔1s钟,逐渐显示1到5的,然后事实情况确不是,浏览器访问的时候,等了5s种后,页面上一 ...

  9. 15-算法训练 P1103

    http://lx.lanqiao.cn/problem.page?gpid=T372   算法训练 P1103   时间限制:1.0s   内存限制:256.0MB      编程实现两个复数的运算 ...

  10. js的urlencode

    function urlencode (str) { str = (str + '').toString(); return encodeURIComponent(str).replace(/!/g, ...