Delphi как загрузить файл на сайт
Репутация: -1
Всего: -1
Однако, я не знаю, как загрузить файл на сервер, после всего этого. Не подскажет ли кто?
Репутация: 2
Всего: 63
В мире всего две бесконечности: вселенная и человеческая глупость. На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
Репутация: -1
Всего: -1
Репутация: 2
Всего: 63
Шифрование и организация фотографий - Photo Database 4.5
Репутация: -1
Всего: -1
Нет, не выходят. Я вас спрашиваю, про конкретное программирования, прошу привести конкретный пример кода, если можно.
Репутация: 2
Всего: 63
Не слышал о таком
P.S. Ну и в любом случае этого может не хватить т.к. сайты часто защищаются дополнительными средствами типа реквест токенов.
Шифрование и организация фотографий - Photo Database 4.5
Репутация: -1
Всего: -1
Репутация: 2
Всего: 63
Шифрование и организация фотографий - Photo Database 4.5
Репутация: -1
Всего: -1
Репутация: 2
Всего: 63
Шифрование и организация фотографий - Photo Database 4.5
Репутация: -1
Всего: -1
Вы часом не индус? Зачем мне запоминать куки, если я хочу загрузить файл в том же блоке кода?
Господи, я задал простой вопрос, неужели нельзя просто на него ответить, а не корчить из себя Хранителя Тайного Знания?
Репутация: 6
Всего: 58
Если же Вы просите готовый код, чтобы тупо скопипастить - называйте цену, в центре помощи.
Cogito, ergo sum
Репутация: -1
Всего: -1
Я попросил обьяснить мне, как дополнить вот этот код:
Репутация: нет
Всего: нет
Репутация: -1
Всего: -1
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.
[ Время генерации скрипта: 0.1520 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Отправлять текст С ГОМОЩЬЮ компонентов ServerSocket И ClientSocket очень просто, и в этом вы убедились при написании троянского коня. Но у многих почему-то возникают проблемы с отправкой файлов, хотя это не намного сложнее.
Сейчас мы напишем две программы: клиент и сервер. Сервер будет загружаться, открывать порт и ожидать соединения. Как только клиент соединится и запросит у сервера файл, сервер выберет файл и отошлет его.
Начнем наш пример с написания сервера, как с более простого. Создайте новый проект и перенесите на форму следующие компоненты.
• Поле ввода Edit, в которое будет вводиться имя файла.
Компонент ServerSocket, с его помощью мы будет отправлять данные. Компонент с помощью которого мы будем открывать файл.
Рис. 4.37. Главная форма сервера
У компонента ServerSocket нужно установить свойство Port равным какому-нибудь реальному значению порта, который будет открываться для ожидания подключения. Я для примера выбрал номер 2 024. После этого я установил свойство Active равным true, чтобы сервер автоматически активизировался при старте.
Здесь мы просто отображаем на экране окно выбора файла, и если пользователь что-то выбрал, то помещаем найденное в строку ввода.
Подготовка закончилась. Теперь нужно написать код для работы с сетью. Наш сервер должен ожидать прихода определенной команды, и если она пришла, то отправлять файл. Для этого мы должны создать обработчик события который вызывается каждый раз, когда данные приходят из сети (листинг 4.6).
В качестве параметров конструктора передается имя файла Editl.Text и режим, в котором будет подключен файл. Нам достаточно использовать режим чтения, поэтому указан флаг fmOpenRead. После открытия текущая позиция в файле должна быть установлено на самое начало. Но, как говорится, "доверяй, но проверяй",- поэтому я насильно устанавливаю позицию в начало:
Теперь можно отправлять выбранный файл. Это лучше сделать с помощью метода SendStrearn компонента Socket. Этот метод отправляет поток любого формата (файловый поток, поток в памяти и т. д.).
Вот и все. Сервер отправил файл, и можно приступать к написанию клиента, который мы сделаем отдельной программой. Создайте новый проект и поместите на форму следующие компоненты:
компонент с помощью которого мы будем присоединяться к серверу и запрашивать/получать файл.
Рис. 4.38. Главная форма клиента
У компонента TClientSocket нужно установить свойство Port равным тому же значению, что и у сервера - 2024.
В разделе private объекта мы объявим несколько переменных:
В обработчике события onclick кнопки Подшочиться напишите следующий код:
В первой строке устанавливается адрес компьютера, где расположен сервер, с которым надо соединиться. Во второй строке активизируем клиента и соединяемся.
В обработчике события onclick кнопки Оттаючигься располагаем следую-код:
Здесь мы просто закрываем соединение.
Как только мы соединились с сервером, сразу же отправляем ему команду s, чтобы сервер выслал файл. Ну а теперь нужно создать обработчик события OnRead для компонента ClientSocket, который будет вызываться каждый раз, когда клиенту приходят данные. В нем пишем следующий код (листинг 4.7).
Процедура достаточно сложная и с ней придется разбираться по частям. В самом начале сохраняется принятый текст в переменной s. Следующий кусок кода будет выполняться, если переменная Reciving равна true. Мы этот кусок пока оставим в покое, а рассмотрим тот, который находится чуть ниже:
Далее мы устанавливаем переменную Reciving равной true. Эта переменная будет говорить о том, что началась передача файла. Так как файл не может прийти за один раз, и мы будем получать его порциями приблизительно по 8 Кбайт, то при последующих вызовах этого обработчика события мы должны знать, что пришедшее - это данные из файла.
В качестве имени указываем output.dat. Я не знаю точного имени файла, поэтому использую такое. Путь не указывается, значит, файл будет записан в ту же директорию, где находится программа. В качестве флага при открытии файла я указываю fmCreate, что заставляет создать новый файл. Если такой файл уже существует, то он будет перезаписан.
Теперь на клиенте, после того как вы выделили размер файла и удалили этот текст из переменной s, таким же образом можно выделить и имя файла и удалить его из принятых данных, чтобы сохранять в файл только его данные.
После открытия файла сохраняем принятые данные с помощью вызова метода write.
Теперь вы готовы разобраться с куском кода, который мы пропустили:
ras: TMemory Stream; //Поток памяти begin ms : =TNemoryStream.Create; //Создаю поток
Это минимальный пример отправки картинки из компонента imagel. Как принять данные, попробуйте додумать сами.
На компакт-диске в директории \Примеры\Глава 4\Send File вы можете увидеть пример программ, созданных в этом разделе.
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Отправлять текст С ГОМОЩЬЮ компонентов ServerSocket И ClientSocket очень просто, и в этом вы убедились при написании троянского коня. Но у многих почему-то возникают проблемы с отправкой файлов, хотя это не намного сложнее.
Сейчас мы напишем две программы: клиент и сервер. Сервер будет загружаться, открывать порт и ожидать соединения. Как только клиент соединится и запросит у сервера файл, сервер выберет файл и отошлет его.
Начнем наш пример с написания сервера, как с более простого. Создайте новый проект и перенесите на форму следующие компоненты.
• Поле ввода Edit, в которое будет вводиться имя файла.
Компонент ServerSocket, с его помощью мы будет отправлять данные. Компонент с помощью которого мы будем открывать файл.
Рис. 4.37. Главная форма сервера
У компонента ServerSocket нужно установить свойство Port равным какому-нибудь реальному значению порта, который будет открываться для ожидания подключения. Я для примера выбрал номер 2 024. После этого я установил свойство Active равным true, чтобы сервер автоматически активизировался при старте.
Здесь мы просто отображаем на экране окно выбора файла, и если пользователь что-то выбрал, то помещаем найденное в строку ввода.
Подготовка закончилась. Теперь нужно написать код для работы с сетью. Наш сервер должен ожидать прихода определенной команды, и если она пришла, то отправлять файл. Для этого мы должны создать обработчик события который вызывается каждый раз, когда данные приходят из сети (листинг 4.6).
В качестве параметров конструктора передается имя файла Editl.Text и режим, в котором будет подключен файл. Нам достаточно использовать режим чтения, поэтому указан флаг fmOpenRead. После открытия текущая позиция в файле должна быть установлено на самое начало. Но, как говорится, "доверяй, но проверяй",- поэтому я насильно устанавливаю позицию в начало:
Теперь можно отправлять выбранный файл. Это лучше сделать с помощью метода SendStrearn компонента Socket. Этот метод отправляет поток любого формата (файловый поток, поток в памяти и т. д.).
Вот и все. Сервер отправил файл, и можно приступать к написанию клиента, который мы сделаем отдельной программой. Создайте новый проект и поместите на форму следующие компоненты:
компонент с помощью которого мы будем присоединяться к серверу и запрашивать/получать файл.
Рис. 4.38. Главная форма клиента
У компонента TClientSocket нужно установить свойство Port равным тому же значению, что и у сервера - 2024.
В разделе private объекта мы объявим несколько переменных:
В обработчике события onclick кнопки Подшочиться напишите следующий код:
В первой строке устанавливается адрес компьютера, где расположен сервер, с которым надо соединиться. Во второй строке активизируем клиента и соединяемся.
В обработчике события onclick кнопки Оттаючигься располагаем следую-код:
Здесь мы просто закрываем соединение.
Как только мы соединились с сервером, сразу же отправляем ему команду s, чтобы сервер выслал файл. Ну а теперь нужно создать обработчик события OnRead для компонента ClientSocket, который будет вызываться каждый раз, когда клиенту приходят данные. В нем пишем следующий код (листинг 4.7).
Процедура достаточно сложная и с ней придется разбираться по частям. В самом начале сохраняется принятый текст в переменной s. Следующий кусок кода будет выполняться, если переменная Reciving равна true. Мы этот кусок пока оставим в покое, а рассмотрим тот, который находится чуть ниже:
Далее мы устанавливаем переменную Reciving равной true. Эта переменная будет говорить о том, что началась передача файла. Так как файл не может прийти за один раз, и мы будем получать его порциями приблизительно по 8 Кбайт, то при последующих вызовах этого обработчика события мы должны знать, что пришедшее - это данные из файла.
В качестве имени указываем output.dat. Я не знаю точного имени файла, поэтому использую такое. Путь не указывается, значит, файл будет записан в ту же директорию, где находится программа. В качестве флага при открытии файла я указываю fmCreate, что заставляет создать новый файл. Если такой файл уже существует, то он будет перезаписан.
Теперь на клиенте, после того как вы выделили размер файла и удалили этот текст из переменной s, таким же образом можно выделить и имя файла и удалить его из принятых данных, чтобы сохранять в файл только его данные.
После открытия файла сохраняем принятые данные с помощью вызова метода write.
Теперь вы готовы разобраться с куском кода, который мы пропустили:
ras: TMemory Stream; //Поток памяти begin ms : =TNemoryStream.Create; //Создаю поток
Это минимальный пример отправки картинки из компонента imagel. Как принять данные, попробуйте додумать сами.
На компакт-диске в директории \Примеры\Глава 4\Send File вы можете увидеть пример программ, созданных в этом разделе.
Бросаем на форму два TEdit, TProgressBar, одну кнопку и TSaveDialog.
Для кнопки пишем маленький обработчик:
Теперь на форму добавим IdHTTP и кнопку (Button2) с надписью "начать закачку".
С обработчиком пока повременим, а напишем самое сложное - класс для потока.
//---------------------------------------
type
TDownLoader = class (TThread)
protected
procedure Execute; override;
public
property URL:string read FURL write FURL;
property ToFolder:string read FToFolder write FToFolder;
end ;
Первые две строки сделаны для того, чтобы было видно, где вписать код. И нажимаем Ctrl+Shift+C. Delphi допишет немного кода. Он теперь будет выглядеть так:
type
TDownLoader = class (TThread)
private
FToFolder: string;
FURL: string;
protected
procedure Execute; override;
published
public
property URL:string read FURL write FURL;
property ToFolder:string read FToFolder write FToFolder;
end ;
procedure TDownLoader.Execute;
begin
//здесь мы начнём писать код работы
end ;
Главный код потока
Итак, код обработчика:
Помните, что в этой процедуре нельзя напрямую обращаться к компонентам формы и другим потокам. Это делается специальным образом, который называется синхронизацией.
И наконец, обработчик для кнопки:
procedure TForm1.Button2Click(Sender: TObject);
var d:TDownLoader;
begin
//Создадим класс потока.
//Поток для начала будет остановлен
d := TDownLoader.Create(true);
//Передадим параметры потоку
d.URL := Edit1.Text;
d.ToFolder := Edit2.Text;
//Поток должен удалить себя по завершению своей работы
d.FreeOnTerminate := true;
//И запустим его на закачку.
d.Resume;
//Теперь с процедуры мы выйдем, но поток работает
//и живёт своей жизней
end ;
Теперь наш код уже может качать, но у нас нет прогресса, нет уведомления о завершении закачки.
Добавим для начала уведомление о закачке. Добавим в public часть формы добавим строку:
public
< public declarations >
procedure thrTerminate(Sender:TObject);
end ;
и нажмём Ctrl+Shift+C .
procedure TForm1.thrTerminate(Sender: TObject);
begin
ShowMessage( 'Готово' );
end ;
И добавим её вызов в обработчике кнопки запуска:
//Поток должен удалить себя по завершению своей работы
d.FreeOnTerminate := true;
d.OnTerminate := thrTerminate;
Теперь у нас осталась ещё одна проблема - оживить прогресс-бар. Но здесь нас подстерегает один момент: с потока нельзя просто так обращаться к компонентам формы. Точнее, правило звучит так: с одного потока нельзя обращаться к данным другого потока (переменным, коду) без специальных методов. Таких методов есть два. Первый - мы останавливаем один поток, а второй на это время получает доступ к его переменным. Либо второй поток просит первый исполнить какой-то код, а сам на это время засыпает.
Поехали дальше. После uses перед Type вставим строку:
const
MY_MESS = WM_USER + 100;
А в объявлении формы добавим новый метод:
procedure MyProgress( var msg:TMessage);message MY_MESS;
И заветное Ctrl+Shift+C
В свежесозданном обработчике пишем такое:
procedure TForm1.MyProgress( var msg: TMessage);
begin
case msg.WParam of
0: begin ProgressBar1.Max := msg.LParam;ProgressBar1.Position := 0; end ;
1: ProgressBar1.Position := msg.LParam;
end ;
end ;
То-есть, если передали тип операции 0 - значит нужно инициализировать прогресс. Передали 1 - нужно выставить позицию. Как именно - указано в другом параметре (msg.LParam).
В сопутствующем архиве вы найдёте полный рабочий пример. Он будет компилироваться на Delphi 2006 и Indy 10. На 7 Delphi сходу может не скомпилироваться, но если вы будете делать вручную и немного думать, то всё заработает. Причина - с Delphi 7 поставляется более старая версияIndy.
Читайте также: