Как из Delphi закачать файл на сайт (принимает PHP)
Из названия понятна проблема - прога на Delphi должна через инет передать хосту файл (бинарник).
Если кто сталкивался, дайте пожалуйста, куски кода на Delphi и РНР. Задача, чтобы файл был принят РНР в переменную или записан (это уже дальше понятно). У меня Delphi BDS 2006.
У меня есть общие мысли:
надо с помощью дельфи смоделировать работу браузера, т.е. отправить некий браузерный запрос на сервер, в котором методом POST передется этот самый файл. URL должен быть адресован тому PHP скрипту, который и будет подцеплять файл и играться с ним.
Значит тебе нужно:
1) Посмотреть структуру запросов, отсылаемых браузером. Говрят что там ничего сложного нет. Заголовки, потом переменные. Если бинарник, то надо тип контекста указать наверное ещё...
2) Смоделировать такую же структуру (интерфейс) с передачей файла.
И дело в шляпе, старина.
ЗЫ. Если получится, напиши как решил эту задачу.
ЗЫ.
А ещё можно так извратиться.
Открыть в браузере страницу с стандартной формой для отправки файла.
Написать скрипт на VBS, который будет автоматом нажимать кнопку и вставлять файл, и отправлять его.
Этот скрипт запускать из Дельфи.
Ну чем не решение? :)
Посмотри
Delphi:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP,IdMultipartFormData;
type
TForm2 = class(TForm)
IdHTTP1: TIdHTTP;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Memo1: TMemo;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button2Click(Sender: TObject);
var FileName: string;response: string;
var formData: TIdMultiPartFormDataStream;
begin
FileName := 'c:\pic.gif';
formData := TIdMultiPartFormDataStream.Create;
formData.AddFile('File',fileName,'application/octet-stream');
formData.AddFormField('param1', 'value1');
//HttpObject.Port := Port;
response := idHTTP1.Post('http://myhost/ppost.php',formData);
Label1.Caption:= response ;
Memo1.Lines.Text:= response ;
end;
end.
PHP
<?
copy($File,"!!!.gif")
?>
те. как прием с обічной формы
Я давно уже работаю с компонентом TIdHTTP, а вот про IdMultipartFormData не знал (его нет на палитре визуальных). А тут потребовалось передавать файлы на сайт!
По ходу дела скажу, что IdMultipartFormData при отправке формы прибавляет к ПОСЛЕДНЕМУ полю ещё два кода - "перевод строки/возврат каретки". Таким образом, длина поля увеличивается на два байта. В системах, жестко, контролирующих длину передаваемых данных это может приводить к постоянной ошибке. Для устранения проблемки мне пришлось просто добавить в конец ещё одно "холостое" поле, т.е. так:
...
formData.AddFormField('param1', 'value1');
formData.AddFormField('param2', 'value2');
formData.AddFormField('param3', 'value3');
formData.AddFormField('EmptyField', '');