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字符作为输入,因此不存在不匹配. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |