[转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件
开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件。对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章。
在xalion窑主的指导下,我使用了indy自带的TIdMultiPartFormDataStre
如果使用indy的idhttp,则调用这个方法,即可以提交Form.
function Post(AURL: string; ASource: TIdMultiPartFormDataStream):
string;
在窑主的建议下,使用了TMS Sparkle组件,对TIdMultiPartFormDataStream进行提交。
先实现下面这个函数,向指定网址提交TIdMultiPartFormDataStream对象:
function PostForm(url: string; aSource:
TIdMultiPartFormDataStream): string;
var
FClient: THttpClient;
Req: THttpRequest;
Resp: THttpResponse;
// buffer: TBytes;
begin
FClient := THttpClient.Create;
Resp := nil;
Req := FClient.CreateRequest;
try
Req.Uri :=
url;
Req.Method
:= 'POST';
Req.Headers.SetValue('content-type',
aSource.RequestContentType);
Req.SetContent(GetContentAsBytes(aSource));
Resp :=
FClient.Send(Req);
Result :=
TEncoding.UTF8.GetString(Resp.ContentAsBytes);
finally
FreeAndNil(Req);
FreeAndNil(Resp);
FreeAndNil(FClient);
end;
end;
上述方法中,使用了GetContentAsBytes函数,把一个TStream转换为TBytes.这个函数是参考TMS
Sparkle的实现改写的。
function GetContentAsBytes(aSource: TStream): TBytes;
const
BufSize = 8192;
var
BytesRead: Integer;
TotalRead: Integer;
begin
Setlength(Result, 0);
TotalRead := 0;
repeat
Setlength(Result, Length(Result) + BufSize);
BytesRead :=
aSource.Read(Result[TotalRead], BufSize);
TotalRead :=
TotalRead + BytesRead;
until BytesRead <> BufSize;
Setlength(Result, TotalRead);
end;
最后,具体封装上传文件的接口。调用这个接口,以变参的方式,返回微信平台返回的结果。具体的实现过程,建立一个TIdMultiPartFormDataStream对象,叫FormData,再调用FormData.AddFile方法,将上传的文件加入其中。之后,利用上面实现的PostForm提交FormData对象,接下来,对微信平台返回的结果进行处理,并利用变参返回。
procedure UploadMedia(access_token, aFilePath: string; var aType:
string;
var media_id: string; var Created_at: TDatetime;
var errcode: Integer;
var errmsg: string);
var
url: string;
FormData: TIdMultiPartFormDataStream;
r: string;
jo: TjsonObject;
jv: Tjsonvalue;
begin
url := Format
('http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s',
[access_token, aType]);
FormData :=
TIdMultiPartFormDataStream.Create;
try
FormData.AddFile('media', aFilePath);
r :=
PostForm(url, FormData);
jo :=
TjsonObject.ParseJSONValue(r) as TjsonObject;
if
jo.TryGetValue('media_id', jv) then
begin
aType := jo.GetValue('type').Value;
media_id := jo.GetValue('media_id').Value;
Created_at :=
DateUtils.UnixToDateTime(jo.GetValue('created_at')
.Value.ToInteger, False);
errcode := 0;
errmsg := '';
end
else
begin
errcode := jo.GetValue('errcode').Value.ToInteger;
errmsg := jo.GetValue('errmsg').Value;
end;
finally
FreeAndNil(FormData);
end;
end;
调用代码:
procedure Twm.UploadMedia(id: integer; aFile, aType: string);
var
errcode: integer;
errmsg: string;
Created_at: TDateTime;
stype, media_id: string;
begin
if not qUploadMedia.Active then
qUploadMedia.Open;
stype := aType;
WX_Impl.UploadMedia(GetAccessToken(id.ToString),
aFile, stype, media_id,
Created_at,
errcode, errmsg);
if errcode = 0 then
begin
//写入本地表.
qUploadMedia.AppendRecord([id, stype, media_id, Created_at,
aFile]);
webLogger.WriteLog('上传成功,media_id=:' + media_id +
' 时间:' +
DateToStr(Created_at) + ' Type:' + sType)
end
else
webLogger.WriteLog('上传失败:' + errcode.ToString + ':' +
errmsg);
end;
[转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件的更多相关文章
- [转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台
先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数,然后申请微信公众平台接口测试帐号. function CheckSignature(const ...
- [转载红鱼儿]delphi 实现微信开发(1)
大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在u ...
- Linux下开发python django程序(设置admin后台管理上传文件和前台上传文件保存数据库)
1.项目创建相关工作参考前面 2.在models.py文件中定义数据库结构 import django.db import modelsclass RegisterUser(models.Model) ...
- [转载红鱼儿]Delphi XE7 update1进步太大了
写以下的文字是怀着无比兴奋的心情写的,急于同朋友们分享XE7的进步! 1.更新的bug列表并不全 通过bug修正列表及发布的消息,可以看到up1修正了很多bug,正如我所说,有些bug并没有写到发布的 ...
- 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType
回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...
- delphi 实现微信开发(1) (使用kbmmw web server)
原文地址:delphi 实现微信开发(1)作者:红鱼儿 大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生 ...
- C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 微信小程序小技巧系列《二》show内容展示,上传文件编码问题
作者:gou-tian 来自:github show内容展示 尝试用微信小程序的template组件实现.同时,尝试页面间转跳时传参,在目标页面引入模板文件实现 写的更少,做的更多 篇幅有限详细代码此 ...
- IOS上传文件开发
IOS上传文件开发 在移动应用开发 文件形式上传是不可缺少的,近期把IOS这块文件上传文件代码简单的整理一下.假设大家有须要安卓这边的代码,本人也能够分享给大家! QQ群:74432915 ...
随机推荐
- Genymotion——VirtualBox cannot start virtual device
提示"VirtualBox cannot start virtual device" 打开VirtualBox,想要在里面直接启动Genymotion模拟器,又出现错误,提示“Un ...
- robot framework添加库注意事项
添加库 假设你的项目结构是这样: 项目 ..myLib(库目录) ..目录1 ..测试用例套件1 此时你需要在“测试用例套件1”中用相对路径添加库myLib,你应该填:../myLib/ 特别注意后面 ...
- docker 简单入门(一)
本篇目录 写在最前面的话 docker概念介绍 镜像的概念.容器的概念 docker的安装介绍 写在最前面的话 大家好,首先跟大家说声对不起,我班门弄斧了,我本身是做系统开发,使用的语言是C#和JAV ...
- CSS镂空图片处理
来源:http://www.zhangxinxu.com/wordpress/?p=5267,分享收藏 使用镂空图片,通过CSS改变颜色,达到图片切换的效果,可以同过背景图,然后改变背景色,从而达到图 ...
- RESTful介绍和使用教程
出自:https://blog.csdn.net/x541211190/article/details/81141459 一.REST起源REST(Representational State Tra ...
- python中range()、list()函数的用法
Python range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表. 函数语法: range(stop) range(start, stop , ...
- Nagios自定义扩展
原理:监控端通过check_nrpe把要监控的指令发送给被监控端,被监控端在本机执行监控任务,并把执行的结果发送回监控端. 如何扩展Nagios,以实现自定义监控? 借助插件进行的每一次有效的Nagi ...
- 【转】Java自学之路——by马士兵
作者:马士兵老师 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟 ...
- TEXT 3 Food firms and fat-fighters
TEXT 3 Food firms and fat-fighters 食品公司与减肥斗士 Feb 9th 2006 From The Economist Global Agenda Five lead ...
- 迷你MVVM框架 avalonjs 学习教程20、路由系统
SPA的成功离开不这三个东西,分层架构,路由系统,储存系统.分层架构是我们组织复杂代码的关键,这里特指MVVM的avalon:路由系统是将多个页面压缩在一个页面的关键:储存系统特指本地储存,是安全保存 ...