2012-09-05 54 views
4

我必須用delphi發送文件到php腳本。 我finaly選擇使用Wininet的功能,因爲我必須通過NTLM身份驗證代理。使用HTTPSendRequest上傳

當我發送的文件,我有我的內容請求的每個字符之間的空字符(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')); 

發生了什麼事的任何想法?

回答

7

你沒有考慮到德爾福字符串轉換爲UTF-16編碼的Unicode開始於2009年德爾福當你通過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字符的輸入,所以沒有不匹配。

2

您是否在使用Delphi 2009或更高版本?如果是這樣,那麼你的字符串將是unicode。嘗試使用AnsiString類型的變量爲您TESTR字符串