Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправка файла POST-запросом... [D7, WinXP]


Max.66RUS ©   (2008-01-26 23:36:00) 

Добрый день. Необходимо решить следующую задачу - есть следующий простейший PHP-скрипт:



На него нужно POST запросом отправит файл(тип файла может быть любой, например RAR архив) из Delphi приложения. После долгих поисков в сети почти нашел решение данной задачи при помощи вот такого кода:

Uses WinInet;

Const
Host: PChar='хост';
Path: PChar='путь до скрипта';

Function GetFileData(szFile: PChar): PChar;
Var
hFile, dwSize, dwBytes: DWORD;
Begin
Result:='';
hFile:=CreateFile(szFile, GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
If hFileINVALID_HANDLE_VALUE then
Begin
dwSize:=GetFileSize(hFile, nil);
Result:=VirtualAlloc(nil, dwSize, MEM_COMMIT, PAGE_READWRITE);
ReadFile(hFile, Result^, dwSize, dwBytes, nil);
End;
CloseHandle(hFile);
End;

Procedure SendPOSTData(Const szHost, szPath, szData: PChar);
Var
hOpenHandle, hConnectHandle, hResourceHandle: Pointer;
Begin
hOpenHandle:=InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
If hOpenHandlenil then
Begin
hConnectHandle:=InternetConnect(hOpenHandle, szHost, 80, nil, nil, 3, 0, 0);
If hConnectHandlenil then
Begin
hResourceHandle:=HttpOpenRequest(hConnectHandle, 'POST', szPath, nil, nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 0);
If hResourceHandlenil then
Begin
HttpSendRequest(hResourceHandle, 'Content-Type: application/x-www-form-urlencoded', 47, szData, lstrlen(szData));
End;
InternetCloseHandle(hResourceHandle);
End;
InternetCloseHandle(hConnectHandle);
End;
InternetCloseHandle(hOpenHandle);
End;

Procedure TForm1.Button1Click(Sender: TObject);
Begin
ZeroMemory(@szBuf, SizeOf(szBuf));
lstrcpy(szBuf, PChar('fname=файл.txt&data='));
lstrcat(szBuf, ((GetFileData(PChar('C:/файл.txt')))));
SendPOSTData(Host, Path, szBuf);
End;


Данный код прекрасно работает и выполняет свою задачу кроме одного очень неприятного момента, если например в отправляемом текстовом(или любом другом файле) содержатся символы "или ', то после загрузки файла на хост данные символы в файле преобразуются в сочетание \"или \'. Т.е. если до отправки в текстовом файле был текст:

aaa"bbb'

То после загрузки на хост содержимое файла меняется на:

aaa\"bbb\'

Для текстовых файлов данное изменение не критично, но вот например для исполняемых очень. Т.к. после загрузки на хост исполняемый файл становится неработоспособным.

Подскажите - как эту проблему исправить? Нужно чтобы файлы загружались без изменений... Сначала думал, что тут дело в параметре Content-Type: application/x-www-form-urlencoded, изменил его на Content-Type: application/octet-stream- приложение вообще перестало работать, т.е. файлы не загружались на хост...( В общем помогите...


  (2009-02-20 22:35:00) [1]

Удалено модератором


  (2009-01-22 05:50:00) [2]

Удалено модератором


ketmar   (2008-01-27 13:04:00) [3]

барин, а вы вообще в курсе, что такое content-type и зачем оно надо? а также чем отличается octet-stream от url-encoded? и что у php, вообще-то, документация есть?


Nucer   (2008-01-27 11:28:00) [4]

В скрипте надо использовать функции is_uploaded_file, move_uploaded_file.


Наверх

Титульная страница Поиск, карта сайта Написать письмо