delphi 使用idhttp+TIdMultiPartFormDataStream 上传表单post文件并解决ssl问题
最近工作需要对接企业微信的推送信息接口
里面有发文件的功能
所以特地记录下上传文件并且使用idhttp遇到的访问ssl网址报错问题
参考文档:https://blog.csdn.net/huohuotu/article/details/77337087
官方上传临时素材文档:https://work.weixin.qq.com/api/doc/90000/90135/90253
下面不多说,直接贴上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | function xxx . UploadFile( const sAccessToken, sFile, sFileType: string ): string ; var IdHttp: TIdHTTP; MutPartForm: TIdMultiPartFormDataStream; Ms: TStringStream; sTmp: string ; begin Result := '' ; try Ms := TStringStream . Create( '' , TEncoding . UTF8); IdHttp := TIdHttp . Create( nil ); IdHttp . ReadTimeout := 30000 ; MutPartForm := TIdMultiPartFormDataStream . Create; try IdHttp . AllowCookies := True ; IdHttp . HandleRedirects := True ; //允许重定向 // Http1.1 IdHttp . HTTPOptions := IdHttp . HTTPOptions + [hoKeepOrigProtocol]; IdHttp . ProtocolVersion := pv1_1; //MutPartForm.AddFormField('file', sFile); sTmp := Format( 'http://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s' ,[sAccessToken, sFileType]); IdHttp . Post(sTmp, MutPartForm, Ms); Result := Ms . DataString; finally Ms . Free; IdHttp . Free; MutPartForm . Free; end ; except on E: Exception do Result := E . Message; end ; end ; |
但是这段代码会遇到两个问题:
1:发送的文件显示了完整的路径和文件名
2:有时候会报 IOHandler value is not valid错误
当然,如果你不在意文件名并且没有遇到这个报错问题的话,可以用这段代码
下面是解决这两个问题的改进版:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | function xxx . UploadFile( const sAccessToken, sFile, sFileType: string ): string ; var IdHttp: TIdHTTP; MutPartForm: TIdMultiPartFormDataStream; Ms: TStringStream; sTmp: string ; LStream: TIdReadFileExclusiveStream; SSLIO: TIdSSLIOHandlerSocketOpenSSL; begin Result := '' ; try Ms := TStringStream . Create( '' , TEncoding . UTF8); IdHttp := TIdHttp . Create( nil ); IdHttp . ReadTimeout := 30000 ; MutPartForm := TIdMultiPartFormDataStream . Create; LStream := TIdReadFileExclusiveStream . Create(sFile); SSLIO := TIdSSLIOHandlerSocketOpenSSL . Create( nil ); try IdHttp . AllowCookies := True ; IdHttp . HandleRedirects := True ; //允许重定向 SSLIO . SSLOptions . Method:=sslvTLSv1; SSLIO . SSLOptions . Mode := sslmClient; IdHttp . IOHandler := SSLIO; // Http1.1 IdHttp . HTTPOptions := IdHttp . HTTPOptions + [hoKeepOrigProtocol]; IdHttp . ProtocolVersion := pv1_1; MutPartForm . AddObject( 'media' , 'application/octet-stream' , LStream, ExtractFileName(sFile)); sTmp := Format( 'http://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s' ,[sAccessToken, sFileType]); IdHttp . Post(sTmp, MutPartForm, Ms); Result := Ms . DataString; finally LStream . Free; Ms . Free; IdHttp . Free; MutPartForm . Free; SSLIO . Free; end ; except on E: Exception do Result := E . Message; end ; end ; |
需要增加uses引用的单元:IdGlobal, IdHTTP, IdMultipartFormData, IdSSLOpenSSL
三个参数 ,获取的access_token, 文件路径,和文件类型,
文件类型:分别有图片(image)、语音(voice)、视频(video),普通文件(file)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?