• 主页
  • 招聘
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API

XE7编写微信接口(新增素材文件)返回{"errcode":41005,"errmsg":"media data missing"}

fullhappy 2015-04-07 12:05:59
函数:
function PostSteamMethod(http: TIdHTTP; URL: String; FileName: String;
Max: Integer): String;
var
PostData: TMemoryStream; RespData: TStringStream;
begin
RespData := TStringStream.Create('');
PostData := TMemoryStream.Create;
PostData.LoadFromFile(FileName);
PostData.Position := 0;
try
try
if http = nil then
exit;
http.Post(URL, PostData, RespData);
Result := RespData.DataString;
http.Request.Referer := URL;
except
Dec(Max);
if Max = 0 then
begin
Result := '';
exit;
end;
Result := PostSteamMethod(http, URL, FileName, Max);
end;
finally
http.Disconnect;
FreeAndNil(RespData);
FreeAndNil(PostData);
end;
end;

调用:
var URL,FileName,temp: string;
begin
if OpenDialog1.Execute then
begin
FileName := OpenDialog1.FileName;
end else exit;
URL := 'http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token='+edtAccessToken.Text
+'&type=image';

edtext.Text := URL;
temp := PostSteamMethod(IdHTTP1, URL, FileName, 3);
Memo1.Lines.Text := temp;

总是提示{"errcode":41005,"errmsg":"media data missing"}
需要采用form-data,请问下idhttp这里如何设置和传入这个信息。
...全文
3941 点赞 收藏 8
写回复
8 条回复
阿凡行舟 2016年09月25日
http://www.144d.com/post-380.html
回复 点赞
蓝色光芒 2015年04月09日
我刚才又试了,确实可以成功,我对IdHTTP1和IdSSLIOHandlerSocketOpenSSL1没有作任何属性修改,直接放上去设置IOHander就调用那个函数,就成了,不知道你怎么弄的,我用的XE6
回复 点赞
fullhappy 2015年04月08日
大家有无用过的,帮忙解答下 我试过 TIdMultiPartFormDataStream,也使用了SSL,返回: {"errcode":40005,"errmsg":"invalid file type"} 情况如上
回复 点赞
fullhappy 2015年04月07日
{"errcode":40005,"errmsg":"invalid file type"}
回复 点赞
fullhappy 2015年04月07日
更换了下方式: function PostFormDataMethod(http: TIdHTTP; URL: String; FileName: String; Max: Integer): String; var PostData: TIdMultiPartFormDataStream; RespData: TStringStream; begin RespData := TStringStream.Create(''); PostData := TIdMultiPartFormDataStream.Create; PostData.AddFile('media', FileName, 'multipart/form-data'); try try if http = nil then exit; http.Request.ContentType := PostData.RequestContentType; PostData.Position := 0; http.Post(URL, PostData, RespData); Result := RespData.DataString; http.Request.Referer := URL; except Dec(Max); if Max = 0 then begin Result := ''; exit; end; Result := PostSteamMethod(http, URL, FileName, Max); end; finally http.Disconnect; FreeAndNil(RespData); FreeAndNil(PostData); end; end; 返回:
回复 点赞
fullhappy 2015年04月07日
TIdSSLIOHandlerSocketOpenSSL,并设置IdHTTP1.IOHander指向IdSSLIOHandlerSocketOpenSSL1 这个我有的,并且我设置 SSL属性过【Method=sslvTLSv1 Mode=sslmClient :这里如果设置其它等级就无返回】 URL改为 = 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token='+edtAccessToken.Text+'&type=image'; 现在返回:{"errcode":40005,"errmsg":"invalid file type"} 这样提示说明type错误或者图片文件格式错误,我图片是jpg格式 很奇怪
回复 点赞
fullhappy 2015年04月07日
最先我也是用 api这个接口的,我再试下看
回复 点赞
蓝色光芒 2015年04月07日
微信调用接口SDK说明上,相关说明如下: 接口调用请求说明 http请求方式: POST/FORM,需使用https https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE URL地址以及通讯协议,都和楼主的不一样,搂主是不是没注意到? 使用HTTPS协议,需要给IdHTTP加个东西, 放置或者创建一个TIdSSLIOHandlerSocketOpenSSL,并设置IdHTTP1.IOHander指向IdSSLIOHandlerSocketOpenSSL1 然后用以下函数试试
//上传多媒体文件(这里以上传图片为例)
function wxUpMedia(HTTP: TIdHTTP; AccessToken, MediaType, MediaFile: String): String;
const
  UpMediaUrl : String = 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s';
var
  Url: String;
  FormData: TIdMultiPartFormDataStream;
  RespData: TStringStream;
begin
  RespData := TStringStream.Create('');
  FormData := TIdMultiPartFormDataStream.Create;
  try
    FormData.AddFile('media', MediaFile);
    Url := Format(UpMediaUrl, [AccessToken, MediaType]);
    HTTP.Post(Url, FormData, RespData);
    Result := RespData.DataString;
  finally
    FormData.Free;
    RespData.Free;
  end;
end;
以上函数,我能上传成功,但是,图片发给用户确无法显示,后来我改成了在我方服务器上上传,发送带URL的图文信息给客户就可以正常显示了
回复 点赞
发动态
发帖子
Delphi
创建于2007-08-02

1478

社区成员

26.2w+

社区内容

Delphi 开发及应用
社区公告
暂无公告