Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.02.27;
Скачать: CL | DM;

Вниз

Отправка файла POST-запросом...   Найти похожие ветки 

 
Max.66RUS   (2008-01-26 23:36) [0]

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

<?
$ip=getenv("REMOTE_ADDR");
$filename=$_POST["fname"];
$data=$_POST["data"];
$fp=fopen($ip."_".$filename, "w");
fwrite($fp, $data);
fclose($fp);
?>


На него нужно 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 hFile<>INVALID_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 hOpenHandle<>nil then
Begin
hConnectHandle:=InternetConnect(hOpenHandle, szHost, 80, nil, nil, 3, 0, 0);
If hConnectHandle<>nil then
Begin
hResourceHandle:=HttpOpenRequest(hConnectHandle, "POST", szPath, nil, nil, nil, INTERNET_FLAG_KEEP_CONNECTION, 0);
If hResourceHandle<>nil 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 - приложение вообще перестало работать, т.е. файлы не загружались на хост...( В общем помогите...


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

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


 
ketmar ©   (2008-01-27 13:04) [2]

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


 
имя   (2009-01-22 05:50) [3]

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


 
имя   (2009-02-20 22:35) [4]

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



Страницы: 1 вся ветка

Текущий архив: 2011.02.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.008 c
11-1231103049
haword
2009-01-05 00:04
2011.02.27
Lazarus + MCK KOL + WinCE


15-1290029388
Юрий
2010-11-18 00:29
2011.02.27
С днем рождения ! 18 ноября 2010 четверг


2-1287694639
Ллирик
2010-10-22 00:57
2011.02.27
Offset на строковую константу


15-1282469891
xayam
2010-08-22 13:38
2011.02.27
Регистрация домена в зоне .рф


2-1291285177
Свободный художник
2010-12-02 13:19
2011.02.27
работа с форматом dwg, конертация bmp в dwg и обратно