Форум: "Сети";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];
ВнизОтправка файла 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c