开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件。对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章。

在xalion窑主的指导下,我使用了indy自带的TIdMultiPartFormDataStre

am类,来提交上传的文件。

如果使用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格式上传文件的更多相关文章

  1. [转载红鱼儿]delphi 实现微信开发(2)接入微信公众号平台

    先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数,然后申请微信公众平台接口测试帐号. function CheckSignature(const ...

  2. [转载红鱼儿]delphi 实现微信开发(1)

    大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在u ...

  3. Linux下开发python django程序(设置admin后台管理上传文件和前台上传文件保存数据库)

    1.项目创建相关工作参考前面 2.在models.py文件中定义数据库结构 import django.db import modelsclass RegisterUser(models.Model) ...

  4. [转载红鱼儿]Delphi XE7 update1进步太大了

    写以下的文字是怀着无比兴奋的心情写的,急于同朋友们分享XE7的进步! 1.更新的bug列表并不全 通过bug修正列表及发布的消息,可以看到up1修正了很多bug,正如我所说,有些bug并没有写到发布的 ...

  5. 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType

    回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...

  6. delphi 实现微信开发(1) (使用kbmmw web server)

    原文地址:delphi 实现微信开发(1)作者:红鱼儿 大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生 ...

  7. C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  8. 微信小程序小技巧系列《二》show内容展示,上传文件编码问题

    作者:gou-tian 来自:github show内容展示 尝试用微信小程序的template组件实现.同时,尝试页面间转跳时传参,在目标页面引入模板文件实现 写的更少,做的更多 篇幅有限详细代码此 ...

  9. IOS上传文件开发

    IOS上传文件开发     在移动应用开发  文件形式上传是不可缺少的,近期把IOS这块文件上传文件代码简单的整理一下.假设大家有须要安卓这边的代码,本人也能够分享给大家! QQ群:74432915 ...

随机推荐

  1. controller检查header

    以前都只能拿到request再检查,其实有相应的注解. public Result updateRecentScore(@RequestBody Map map, @RequestHeader(&qu ...

  2. Redis 通用操作2

    01, 一次设置多个键值 => mset key1 value1 key2 value2 key3 value3 ...... 02, 一次获取多个值 => mget ke1 key2 k ...

  3. xe fmx 怎么改变button颜色

    xe fmx 怎么改变button颜色 改变照相机的默认像素CameraComponent1

  4. 18 网络编程-TCP/IP各层介绍(5层模型讲解)

    1.TCP/IP五层协议讲解 物理层--数据链路层--网络层--传输层--应用层 我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议 就 ...

  5. 使用plsql进行查询的时候出现错误:动态执行表不可访问,本会话的自动统计被终止

  6. 第二次安装docker时,报Transaction check error的解决方法

    如果在yum安装软件的时候,出现了Transaction check error:这种情况,说明rpm软件包出现了冲突,解决方法是: vi /etc/yum.repos.d/epel.repo 将en ...

  7. ArcMap导入图层出现General function failure问题

    问题描述: 使用ArcMap的FeatureClassToFeatureClass命令导入图层,出现如下图的错误提示: 解决方法: 参考http://forums.esri.com/thread.as ...

  8. python格式化输出(转)

    在许多编程语言中都包含有格式化字符串的功能,比如C和Fortran语言中的格式化输入输出.Python中内置有对字符串进行格式化的操作%. 模板 格式化字符串时,Python使用一个字符串作为模板.模 ...

  9. js 获取input选择的图片的信息

    1JS $("#btn").click(function () { var imageEle = document.getElementById("images" ...

  10. Analyzing Microarray Data with R

    1) 熟悉CEL file 从 NCBI GEO (http://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE24460)下载GSE24460. 将得到 ...