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[],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 上传文件到服务器端的更多相关文章
- WebClient 上传文件 上传文件到服务器端
一直对于上传文件到服务器端困惑:以前,现在,学到了关于WebClient的post知识 瞬间对于上传文件到服务器觉得好轻松: 原理很简单:我们通过post服务器的页面:把本地的文件直接传递过去: 现在 ...
- OkHttp上传文件,服务器端请求解析找不到文件信息的问题
长话短说,不深入解释了,官方给的上传案例代码: private static final String IMGUR_CLIENT_ID = "..."; private stati ...
- 那些年的 网络通信之 TCP/IP 传输控制协议 ip 加 端口 客户端上传文件到服务器端服务器端返回上传成功消息
多线程开启, 客户端通过 Socket 流 上传文件到服务端的一个小程序练习. 1. 抓住阻塞式方法,去调试 2. 获取对应流对象操作对应的对象 这时候自己不能懵,一定要清晰,最好命名就能区别,一搞混 ...
- 关于FileZilla上传文件后服务器端文件与本地文件大小不一致的解决方法
最近在调试网站时发现,通过ftp上传工具FileZilla上传至服务器端的文件与本地文件大小不一致,虽然没有影响网站的最终显示效果,但仍让我困惑不解.后发现是传输类型的原因,解决方法如下: 中文版Fi ...
- 上传文件到服务器端后进一步推送到sftp服务器
扩展安装 要想sftp服务端发送文件,就需要php脚本具有作为ssh客户端的能力,所以需先为php安装如下扩展 openssl openssl-dev libssh php ssh 扩展 按照下面的命 ...
- 客户端(Winform窗体)上传文件到服务器(web窗体)简单例子
客户端:先创建一个winform窗体的应用程序项目 项目结构
- Android 上传文件,图片。以及服务器端接收相关。
前面一篇文章写了实现照相功能的一个例子,其实那个实现效果是个略缩图.要查看全图就要先指定照片的存放路径.以后我会修改那个文章.今天先说下图片,文件等上传的实现.接着拿照片说事,光照完了不行还得往服务器 ...
- node.js服务器端下载、上传文件
使用request 下载文件: 安装依赖: npm i requestsourceUrl下载源,targetUrl保存路径 async function downLoadFile(sourceUrl, ...
- 鸿蒙的js开发部模式18:鸿蒙的文件上传到python服务器端
1.首先鸿蒙的js文件上传,设置目录路径为: 构建路径在工程主目录下: 该目录的说明见下面描述: 视图构建如下: 界面代码: <div class="container"&g ...
随机推荐
- cf-Global Round2-D. Frets On Fire(二分)
题目链接:http://codeforces.com/contest/1119/problem/D 题意:给n(<=1e5)个数s[i],i=1..n,(0<=s[i]<=1e18) ...
- numpy.random.uniform()
numpy.random.uniform均匀分布 2018年06月19日 23:28:03 徐小妹 阅读数:4238 numpy.random.uniform介绍: 1. 函数原型: numpy ...
- GridView中CheckBox翻页记住选项
<asp:GridView ID="gvYwAssign" runat="server" AutoGenerateColumns="False& ...
- Union and Intersection of two sorted lists 并集和交集
跟面试官确认是arrayList还是singly-linked list /* Union 并集:两个升序的list a, b, 返回其并集(升序排序)*/ public class UnionTw ...
- Svn Server 强制提交者输入注释信息
目的:在项目开发过程中,强制团队成员必须在提交前写上注释 环境简述:SVN服务器:Windows Server 2008 SVN版本:VisualSVN Ltd. 2.7.5 操作方法:在SVN的R ...
- js数据类型和变量
Number JavaScript不区分整数和浮点数,统一用Number表示: 123 0.345 -99 NaN 当无法计算结果时用NaN表示 Infinity 表示无限大,当数值超过js的Numb ...
- ORM学员管理系统单表查询示例
前期准备工作 首先创建好一个项目 一:必须使用MySQL创建一个库 因为ORM只能对表和数据进行处理,所以库必须自己创建 create database mysite; 二:进行相关的配置 在项目my ...
- javascript 高级程序设计 十一
接上一节的创建对象的模式: 原型模式: 对于prototype的理解:我们创建的函数都有一个prototype(原型)属性,这个属性是一个指针指向一个对象,而这个对象的用途是包含基于这个方法的 所有的 ...
- linux中的设备类型
loop设备 loop设备 一.参考命令[root@localhost a]# losetup usage: losetup loop_device ...
- BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防
一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...