4

Delphi を使用してファイルを php スクリプトに送信する必要があります。NTLM 認証プロキシを通過する必要があるため、最終的に Wininet 関数を使用することにしました。

ファイルを送信すると、コンテンツ リクエストの各文字の間に空の文字 (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'));

何が起こっているかについてのアイデアはありますか?

4

2 に答える 2

7

PChar('TESTR')Delphi 2009 以降、Delphi 文字列が UTF-16 でエンコードされた Unicode に切り替わったことを考慮していPWideCharませんPAnsiChar。文字列の文字長は5文字ですが、バイト長は10バイトです。 HTTPSendRequest()文字ではなくバイトで動作します。つまり、ASCII 文字が UTF-16 でエンコードされる方法であるため、実際には 5 バイトを送信しています。2 番目のバイトはそれぞれ null です。

代わりに、最後の行を次のように変更します。

var
  S: AnsiString;
...
S := 'TESTR';
HTTPSendRequest(pRequest, nil, 0, PAnsiChar(S), Length(S)); 

呼び出している他の関数でそれを行う必要はありません。これらの関数は Unicode 文字を入力として受け取るため、不一致はありません。

于 2012-09-05T08:49:57.963 に答える
2

Delphi 2009 以降を使用していますか? もしそうなら、あなたの文字列はユニコードになります。TESTR 文字列に ANSIstring 変数を使用してみてください

于 2012-09-05T08:47:19.040 に答える