我必须使用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, 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'));
有关正在发生的事情的任何想法?
答案 0 :(得分:7)
从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字符作为输入,因此没有不匹配。
答案 1 :(得分:2)
您使用的是Delphi 2009或更高版本吗?如果是这样,那么你的字符串将是unicode。尝试为您的TESTR字符串使用ANSIstring变量