加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 使用HTTPSendRequest上传

发布时间:2020-12-15 09:36:30 所属栏目:大数据 来源:网络整理
导读:我必须用delphi将文件发送到php脚本. 我最终选择使用Wininet功能,因为我必须通过NTLM身份验证代理. 当我发送文件时,我的内容请求的每个字符之间都有空字符(00): POST /upload.php HTTP/1.1User-Agent: MYUSERAGENTHost: 127.0.0.1Cookie: ELSSESSID=k6ood2s
我必须用delphi将文件发送到php脚本.
我最终选择使用Wininet功能,因为我必须通过NTLM身份验证代理.

当我发送文件时,我的内容请求的每个字符之间都有空字符(00):

POST /upload.php HTTP/1.1
User-Agent: MYUSERAGENT
Host: 127.0.0.1
Cookie: ELSSESSID=k6ood2su2fbgrh805vs74fvmk5
Pragma: no-cache
Content-Length: 5

T.E.S

这是我的Delphi代码:

pSession := InternetOpen('MYUSERAGENT',INTERNET_OPEN_TYPE_PRECONFIG,nil,0);
pConnection := InternetConnect(pSession,PChar('127.0.0.1'),INTERNET_DEFAULT_HTTP_PORT,INTERNET_SERVICE_HTTP,0);
pRequest := HTTPOpenRequest(pConnection,PChar('POST'),PChar('/upload.php'),'HTTP/1.0',0);
HTTPSendRequest(pRequest,Pchar('TESTR'),Length('TESTR'));

对于发生了什么的任何想法?

解决方法

你没有考虑Delphi字符串从Delphi 2009开始切换到UTF-16编码的Unicode.当你通过PChar(‘TESTR’)时,你实际上正在传递一个PWideChar,而不是像你期望的那样的PAnsiChar.字符串的字符长度为5个字符,但字节长度为10个字节. HTTPSendRequest()对字节而不是字符进行操作.所以你真的发送5个字节,其中每个第二个字节是空的,因为这是ASCII字符以UTF-16编码的方式.

改为将最后一行更改为:

var
  S: AnsiString;
...
S := 'TESTR';
HTTPSendRequest(pRequest,PAnsiChar(S),Length(S));

您不需要对正在调用的其他函数执行此操作,因为它们确实将Unicode字符作为输入,因此不存在不匹配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读