[转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件

开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用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;

参考的原文地址在这里。

时间: 2024-10-15 16:07:16

[转载红鱼儿]Delphi实现微信开发(3)如何使用multipart/form-data格式上传文件的相关文章

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

先要学习一下接入的资料,在这里,因为原理都在,所以一定要认真阅读,然后,利用Delphi实现一个对应函数,然后申请微信公众平台接口测试帐号. function CheckSignature(const signature, timestamp, nonce, token: string): boolean; var   strs: TStringList;   tmpStr: string; begin   strs := TStringList.Create;   try     strs.A

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

大体思路: 1.用户向服务号发消息,(这里可以是个菜单项,也可以是一个关键词,如:注册会员.) 2.kbmmw web server收到消息,生成一个图文消息给微信,在图文消息中做好自己的url,在url中,可以把第一步消息带来的openid写到url的参数表中. 3.用户点这个图文消息 4.web server收到这个图文消息的url,根据这个url,生成一个网页给微信,这里面关键是把openid写到网页中 5.用户填写这个网页,提交(提交的同时也把openid也提交回来了) 6.Ok,现在得

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

写以下的文字是怀着无比兴奋的心情写的,急于同朋友们分享XE7的进步! 1.更新的bug列表并不全 通过bug修正列表及发布的消息,可以看到up1修正了很多bug,正如我所说,有些bug并没有写到发布的bug列表中,如TextPrompt不显示的问题. 2.解决了对象释放的问题 基于XE7,我做了测试代码,也是我想象中,开发一个实际的项目要用到很多Form,并且是用到时再建立,需要的话,用完就释放掉.为了这个想法,我测试 了很长时间,也看了相关的代码,无耐,实际的结果让人颓丧.问题就是建立一个Fo

Android程序开发通过HttpURLConnection上传文件到服务器_Android

 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HTTP API作为后台上传接口,android客户端我选择用HttpURLConnection来通过form提交文件数据实现上传功能,本来想网上搜搜拷贝一下改改代码就好啦,发现根本没有现成的例子,多数的例子都是基于HttpClient的或者是基于Base64编码以后作为字符串来传输图像数据,于是我不得不自己动手,参考了网上一些资料,最终实现基于HttpURLConnec

IOS开发教程之put上传文件的服务器的配置及实例分享_IOS

1,HTTP常见的方法 GET 获取指定资源 POST 2M 向指定资源提交数据进行处理请求,在RESTful风格中用于新增资源 HEAD 获取指定资源头部信息PUT 替换指定资源(不支持浏览器操作)DELETE 删除指定资源 2,配置服务器的put请求方式: 复制代码 代码如下:   1> n 打开终端p cd /etc/apache2p sudo vim httpd.conf n 在vim中输入p /httpd-dav.conf• 查找httpd-dav.confp 按0将光标移动至行首 p

Android程序开发通过HttpURLConnection上传文件到服务器

一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HTTP API作为后台上传接口,android客户端我选择用HttpURLConnection来通过form提交文件数据实现上传功能,本来想网上搜搜拷贝一下改改代码就好啦,发现根本没有现成的例子,多数的例子都是基于HttpClient的或者是基于Base64编码以后作为字符串来传输图像数据,于是我不得不自己动手,参考了网上一些资料,最终实现基于HttpURLConnect

微信公众号平台大于20MB的视频怎么上传?

  微信公众号上伟大视频的经验.图文消息插入大于20MB的视频文件,微信平台对于各类内容的分享非常有帮助.特别是视频类的,但是能直接上传的只限于20MB以内.在这里我就分享一下如何上传更大的视频文件. 一.先介绍一下微信平台图文消息上传普通视频的方法 1.先新建图文消息.然后在右侧功能列表点击"视频" 2.在出来的页面里可以直接选择在素材库中已经上传的视频,或者点击"新建视频". 3. 上传20MB以下的小视频, 并编辑好内容分类介绍.然后点击同意规则.确定上传.

《HTML5 Canvas游戏开发实战》——1.5 测试与上传代码

1.5 测试与上传代码 在上传工程代码的时候,需要将工程里包含的HTML.图片及JavaScript等所有文件上传至服务器,并保证文件结构不变. 现在来写个简单的页面,测试一下我们的服务器和开发工具是否已经正确无误地安装完毕,同时也可了解一下代码如何在服务器上运行. 按照1.4节中的步骤,建立一个sample1.5.1工程,在工程中新建一个index.html文件,输入代码清单1-8中所示的代码. 代码清单 1-8 <!DOCTYPE html> <html lang="en&

微信内置浏览器限制input file控件上传,求另外的实现方式

问题描述 如题,有个jsp页面要在微信上显示,并提供上传功能,但微信内置浏览器限制了inputfile控件,有没有大神提供一个另外的实现方式,用java处理上传.在线等回复 解决方案 解决方案二:网上一查就能看到都遇到了这个问题,具体是在iphone上微信中的file上传标签可用.在android中用不了,在android中可以用flash上传控制实现,但在iphone中又不支持flash.所以你在判断一下如果是android就调用flash来上传,是iphone则用原生的input上传解决方案