![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отправка файла 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.