作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须使用 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
这是我的德尔福代码:
pSession := InternetOpen('MYUSERAGENT', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
pConnection := InternetConnect(pSession, PChar('127.0.0.1'), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
pRequest := HTTPOpenRequest(pConnection, PChar('POST'), PChar('/upload.php'), 'HTTP/1.0', nil, nil, INTERNET_SERVICE_HTTP, 0);
HTTPSendRequest(pRequest, nil, 0, Pchar('TESTR'), Length('TESTR'));
对正在发生的事情有什么想法吗?
最佳答案
您没有考虑到从 Delphi 2009 开始,Delphi 字符串已切换为 UTF-16 编码的 Unicode。当您传递 PChar('TESTR')
时,您实际上传递的是 PWideChar
,而不是您期望的 PAnsiChar
。字符串的字符长度为5个字符,但字节长度为10个字节。 HTTPSendRequest()
对字节进行操作,而不是对字符进行操作。因此,您确实发送了 5 个字节,其中每个第二个字节都是空,因为这就是 ASCII 字符在 UTF-16 中的编码方式。
将最后一行改为:
var
S: AnsiString;
...
S := 'TESTR';
HTTPSendRequest(pRequest, nil, 0, PAnsiChar(S), Length(S));
您不需要对您调用的其他函数执行此操作,因为它们确实采用 Unicode 字符作为输入,因此不会出现不匹配的情况。
关于delphi - 使用 HTTPSendRequest 上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12277529/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!