gpt4 book ai didi

delphi - 使用 HTTPSendRequest 上传

转载 作者:行者123 更新时间:2023-12-03 15:21:15 25 4
gpt4 key购买 nike

我必须使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com