相关文章推荐
酷酷的鸭蛋  ·  The OSS Access Key Id ...·  1 月前    · 
俊秀的排球  ·  FAQ系列之Impala - 墨天轮·  1 年前    · 

开始前,先看下要实现的微信接口, 上传多媒体文件 ,这个接口是用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;
FClient: THttpClient;
Req: THttpRequest;
Resp: THttpResponse;
//  buffer: TBytes;
begin
FClient := THttpClient.Create;
Resp := nil;
Req := FClient.CreateRequest;
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);
上述方法中,使用了GetContentAsBytes函数,把一个TStream转换为TBytes.这个函数是参考TMS Sparkle的实现改写的。
function GetContentAsBytes(aSource: TStream): TBytes;
const
BufSize = 8192;
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);
最后,具体封装上传文件的接口。调用这个接口,以变参的方式,返回微信平台返回的结果。具体的实现过程,建立一个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);
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;
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 := '';
begin
errcode := jo.GetValue('errcode').Value.ToInteger;
errmsg := jo.GetValue('errmsg').Value;
finally
FreeAndNil(FormData);
调用代码:
procedure Twm.UploadMedia(id: integer; aFile, aType: string);
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)
webLogger.WriteLog('上传失败:' + errcode.ToString + ':' + errmsg); 参考的原文地址在这里。

转载于:https://www.cnblogs.com/xalion/p/4115277.html

开始前,先看下要实现的微信接口,上传多媒体文件,这个接口是用Form表单形式上传的文件。对我来说,对http的Form表单一知半解,还好,查到这个资料,如果你也和我一样,必须看看这篇文章。在xalion窑主的指导下,我使用了indy自带的TIdMultiPartFormDataStream类,来提交上传的文件。如果使用indy的idhttp,则调用这个方法,即可以提交For...
使用 multipart / form-data 文件 发表于2年前(2014-01-20 19:49)   阅读(14046) | 评论(0) 1人收藏此文章, 我要收藏 上海源创会5月15日与你相约【玫瑰里】,赶快来约哦~!>>>   1. 使用 POST发送数据     以POST方式发送数据主要是为了向服务器发送较大量的客户端的数据,它不受URL的长
HTTP上 POST报文通过 使用 TId MultiPart FormDataStream类,在网上看到有人说这个TId MultiPart FormDataStream类 使用 释放有问题,BUG很多,暂时我没遇到,至少解决了我的问题,期待有高手写一个更加好更加完美的类能替代这个。 IdGlobal, Id Multipart FormData,idhttp; 代码片func
idhttp中对于post方法的定义: function Post(AURL: string; ASource: TIdStrings): string; overload; function Post(AURL: string; ASource: TStream): string; overload; function Post(AURL: string; ASourc
formData:=TId MultiPart FormDataStream.Create; formData.AddFormField('someStr','[someStr]'); <==这句有坑 坑的原因: 如果AddFormField的值太长的时候(比如base64编码(base64也有一个坑,在下面讲)的某些东西),indy组件默认会在固定长度时加上“=”。。 加上的“=”会直接. 什么是接口测试,不说广泛的概念,直接电脑打开浏览器,进入 开发 者工具(F12)随意进入一些网站可以看到下面左侧栏出现了一系列的数据: 上面条数据都是一个单独的接口,点击单个接口,右边部分展示出接口的相关信息,请求地址,请求方法,请求头,响应头等等。接口测试具体怎么测主要就是对接口的参数值,响应时间,状态码,返回内容等方面去测试。接口测试我们可以借助一些工具,市面上用的较多的postman,jmeter,我们今天讲下如何 使用 postman做接口。 下载地址:https://www.post
C#版本的的Ms MultiPart FormData,给Flash上 Http的Form用,主要是想给Silverlight用的。具体代码如何下(至于Http的 multipart / form-data 格式 ,大家还是得去找资料来看看了):Content-Type: multipart / form-data ; boundary=---------------------------8db1851cd90
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。 首先来了解什么是 multipart / form-data 请求: 根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那为为何我们还...
好的,关于 使用 curl发送 multipart / form-data 格式 的请求,你可以参考以下步骤: 1. 组装请求参数,将需要上 文件 转化为二进制数据,并按照 multipart / form-data 格式 进行拼接。 2. 使用 curl命令发送请求,同时设置请求头信息,其中Content-Type要设置为 multipart / form-data 。 下面是一个示例,假设需要上 一个名为file.txt的 文件 : curl -X POST -H "Content-Type: multipart / form-data " -F "file=@/path/to/file.txt" http://localhost:8080/upload 其中,-F选项表示将参数以 multipart / form-data 格式 进行表单提交,file=@/path/to/file.txt表示上 文件 的参数名为file, 文件 路径为/path/to/file.txt。 你可以根据自己的需求进行更改。