Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Upload файла на сервер, upload по ftp 
:(
    Опции темы
Akella
Дата 16.2.2005, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Мне кажется, что код RAdmin`а нужно вставить в FAQ и, конечно в DRKB
PM MAIL   Вверх
Ищущий!
Дата 3.6.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



Цитата(RAdmin @ 26.1.2005, 20:57)
Код


uses Wininet;

var
 FtpHandle,InetHandle: HInternet;


procedure TForm1.Button1Click(Sender: TObject);
begin
   InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);
    FtpHandle := InternetConnect(InetHandle, PChar('ftp.server.com'), 21, PChar('UserName'),
        PChar('Password'), INTERNET_SERVICE_FTP, 0, 255);
     if not Assigned(FtpHandle) then
      InternetCloseHandle(InetHandle)
   else

     try
        FtpPutFile(FtpHandle, PChar('LocalFilePath'), PChar('FileNameOnServer'),
        FTP_TRANSFER_TYPE_BINARY, 255);
        except

     end;
  InternetCloseHandle(InetHandle);
end;

Отличная штука... и тут вопрос... а как узнать прогресс загрузки, сколько загружено и сколько осталось?
PM MAIL   Вверх
RA
Дата 3.6.2005, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



smile
Код


uses Wininet;

var
 FtpHandle,InetHandle: HInternet;
 BytesOut,BytesIn:LongInt;

.......

procedure TForm1.Button1Click(Sender: TObject);
begin
   InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);
   InternetSetStatusCallback(InetHandle, @InetCallback);

    FtpHandle := InternetConnect(InetHandle, PChar('ftp.server.com'), 21, PChar('UserName'),
        PChar('Password'), INTERNET_SERVICE_FTP, 0, 255);
     if not Assigned(FtpHandle) then
      InternetCloseHandle(InetHandle)
   else

     try
        FtpPutFile(FtpHandle, PChar('LocalFilePath'), PChar('FileNameOnServer'),
        FTP_TRANSFER_TYPE_BINARY, 255);
        except

     end;
  InternetCloseHandle(InetHandle);
end;


procedure InetCallback(HInternet: HINTERNET; dwContext, dwInternetStatus: DWORD;
  lpStatusInfo: Pointer; dwStatusInfoLen: DWORD); stdcall;
begin
  case dwInternetStatus of

    INTERNET_STATUS_REQUEST_SENT:  BytesOut:=BytesOut+DWORD(lpStatusInfo^); {Upload}
    INTERNET_STATUS_RESPONSE_RECEIVED: BytesIn:=bytesIn+DWORD(lpStatusInfo^); {Download}

    {Это сам обрабатывай :) }
    INTERNET_STATUS_RECEIVING_RESPONSE:;
    INTERNET_STATUS_RESOLVING_NAME:;
    INTERNET_STATUS_NAME_RESOLVED:;
    INTERNET_STATUS_CONNECTING_TO_SERVER:;
    INTERNET_STATUS_CONNECTED_TO_SERVER:;
    INTERNET_STATUS_SENDING_REQUEST:;
    INTERNET_STATUS_CTL_RESPONSE_RECEIVED:;
    INTERNET_STATUS_PREFETCH:;
    INTERNET_STATUS_CLOSING_CONNECTION:;
    INTERNET_STATUS_CONNECTION_CLOSED:;
    INTERNET_STATUS_HANDLE_CREATED:;
    INTERNET_STATUS_HANDLE_CLOSING:;
    INTERNET_STATUS_REQUEST_COMPLETE:;
    INTERNET_STATUS_REDIRECT:;
    INTERNET_STATUS_INTERMEDIATE_RESPONSE:;
    INTERNET_STATUS_STATE_CHANGE:;
  end;

end;



PM   Вверх
Ищущий!
Дата 4.6.2005, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



Типа огромное спасибо... а мож чуть еще помучать Вас smile и всё же... как увидеть процесс загрузки файла в процентах?
PM MAIL   Вверх
RA
Дата 4.6.2005, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



smile smile

Из выше показанного примера следует что

BytesOut - колличество отправленных байт
BytesIn - колличество принятых байт

следовательно что бы сделать прогресс:

{Upload}
//Делим кол-во отправленных байт на Размер твоего файла и умножаем на 100.
//(Ну и округляем это дело)
ProgressBar1.Position:=Round(BytesOut / MyFileSize * 100);
//MyFileSize - кол-во байт d твоем файле, только не спрашивай как узнать сколько //весит твой фаил smile


{Download}
//The same shit.
ProgressBar1.Position:=Round(BytesIn / MyFileSize * 100);
//MyFileSize - кол-во байт в файла на фтпЕ, получаем с помощью
//функции FtpGetFileSize из тогоже winInet.


ЗЫ: "ProgressBar1.Position:= ..." можешь засунуть прям в конец процедуры InetCallback;




PM   Вверх
Ищущий!
Дата 4.6.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



Цитата(RAdmin @ 4.6.2005, 16:22)
ЗЫ: "ProgressBar1.Position:= ..." можешь засунуть прям в конец процедуры InetCallback;

Спасибо, это то что мне надо было услыхать smile
PM MAIL   Вверх
RA
Дата 4.6.2005, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



Пожал100
PM   Вверх
Akella
Дата 7.6.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



для получения размера файла, нужно ли его открывать?
типа
Код

 hFile:=WinInet.FtpOpenFile(InetHandle, ...)

Добавлено @ 16:16
что поставить в качестве dwAccess?
Добавлено @ 16:22
нашёл GENERIC_READ
PM MAIL   Вверх
Akella
Дата 7.6.2005, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



а что енто ща второй параметр?
Код

FtpGetFileSize(hFile, ???)

PM MAIL   Вверх
RA
Дата 7.6.2005, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



Цитата(dsergey @ 7.6.2005, 16:12)
для получения размера файла, нужно ли его открывать?
типа


Угу. smile


Кстати можно, получить размер файла через FtpFindFirstFile.
PM   Вверх
Akella
Дата 7.6.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



Код

InetCallback

в каком месте нужно её вызвать?
Добавлено @ 16:52
Код

procedure TfmSendFiles.ByFtp;
Var
 _iF:integer;
begin
 bbSend.Enabled:=False;
  if uInet.ConnectedToInternet = ctNone then begin
    ShowMessage('Нет подключения к сети интернет');
    exit;
  end;//if
  InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);
  FtpHandle := InternetConnect(InetHandle,
                                PChar(leFtpAdress.text),
                                StrToInt(leFtpPort.Text),
                                PChar(leFtpUserName.Text),
                                PChar(leFtpPassword.Text),
                                INTERNET_SERVICE_FTP,0,255);
  if not Assigned(FtpHandle) then
    InternetCloseHandle(InetHandle)
  else begin
    FtpSetCurrentDirectory(FtpHandle,PAnsiChar(leFTPDir.Text));
    //пробегаем по списку выбранный файлов
    For _iF:=0 to lvFilesToSend.Items.Count-1 do
      if lvFilesToSend.Items[_if].Checked then
        try
          FtpPutFile(FtpHandle, PChar(fmMain.sPathToSave+lvFilesToSend.Items[_if].Caption),
                     PChar(lvFilesToSend.Items[_if].Caption), FTP_TRANSFER_TYPE_BINARY, 255);
          //в этом месте будет правильно или нет?
        except
          Showmessage('Ошибка отправки файла: '+fmMain.sPathToSave+lvFilesToSend.Items[_if].Caption+
                      'Проверьте наличие файла');
        end;//try-except
  end;//else

 DeleteSended;
 bbSend.Enabled:=True;
 ShowMessage('Готово');
 if cbAutoHungUp.Checked then HungUp;
end;


Я ведь оправляю несколько файлов
PM MAIL   Вверх
RA
Дата 7.6.2005, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



То выше был чисто пример (наверное я этим примеров всех запутал),
на самомо деле стоит разделять отправку, соединение и разъединение.
Код


var //Глобальные переменные
 FtpHandle,InetHandle: HInternet;
 BytesOut,BytesIn:LongInt;

procedure Connect; //Соединение
begin
   InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);
   InternetSetStatusCallback(InetHandle, @InetCallback);

    FtpHandle := InternetConnect(InetHandle, PChar('ftp.server.com'), 21, PChar('UserName'),
        PChar('Password'), INTERNET_SERVICE_FTP, 0, 255);
     if not Assigned(FtpHandle) then
      InternetCloseHandle(InetHandle);
end;

procedure Disconnect; //Сами понимаете
begin
  InternetCloseHandle(InetHandle);
end;

Function SendFile(Scr, Dest:AnsiString):boolena; 
//Отправка, можно прицепить try except, но не уверен что это может понадобиться
begin
      Result:=  FtpPutFile(FtpHandle, PChar(Scr), PChar(Dest),
        FTP_TRANSFER_TYPE_BINARY, 255);
end;


//Так выглядит отправка, обратите внимание на то как записывается адресс будущего файла на ftp.
 SendFile('C:\1.exe', '/ftpfolder1/folder2/myfile.exe');
   

........


Цитата(dsergey @ 7.6.2005, 16:29)
а что енто ща второй параметр?

код Pascal/Delphi
1:

FtpGetFileSize(hFile, ???)

Упс не заметил этого вопроса.


Тут первым параметром идёт Хендл полученный после вызова FtpOpenFile
второй параметр возвращает размер нашего файла.
var
FSize: Int64;
...
FtpGetFileSize(FileHandle,Fsize);

далее форматируй Fsize.








Добавлено @ 20:25
Цитата(dsergey @ 7.6.2005, 16:50)
в каком месте нужно её вызвать?


После того как получил хэндл от InternetOpen

Добавлено @ 20:29
Цитата(dsergey @ 7.6.2005, 16:50)
  //пробегаем по списку выбранный файлов
    For _iF:=0 to lvFilesToSend.Items.Count-1 do
      if lvFilesToSend.Items[_if].Checked then
        try
          FtpPutFile(FtpHandle, PChar(fmMain.sPathToSave+lvFilesToSend.Items[_if].Caption),
                    PChar(lvFilesToSend.Items[_if].Caption), FTP_TRANSFER_TYPE_BINARY, 255);
          //в этом месте будет правильно или нет?
        except
          Showmessage('Ошибка отправки файла: '+fmMain.sPathToSave+lvFilesToSend.Items[_if].Caption+
                      'Проверьте наличие файла');
        end;//try-except
  end;//else


Плз не пиши таких вещей как lvFilesToSend.Items[_if].Caption и sPathToSave+lvFilesToSend.Items я же не знаю что в них вписанно.

А вобще конструкция вроде рабочая, вот только от try except можно избавиться.
PM   Вверх
Ak47t
Дата 25.7.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



smile а как при помоши FtpGetFile закачать файл на комп
Опишите пожалуйста если не лень smile
PM MAIL ICQ   Вверх
RA
Дата 25.7.2005, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



Код

FtpGetFile(FtpHandle, PChar(FileOnServer), PChar(FileOnLocalDrive),
        True, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY or INTERNET_FLAG_RELOAD, 255)

PM   Вверх
Ak47t
Дата 25.7.2005, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 25.7.2005

Репутация: нет
Всего: нет



большое спасибо smile
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1368 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.