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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузить файл програмно на сервер, вроде рапиды и их подобным 
:(
    Опции темы
Zlo
  Дата 15.12.2009, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Собственно что нам требуется:
Необходимо взять файл и загрузить его на файловый хостинг например на webfile.ru

Собственно даже не подозреваю с чего начать... Желательно не используя сторонних библиотек, а прямо средствами винды, но как?
Может быть даже у кого-то есть пример или кусок кода- буду рад всему smile

PM MAIL   Вверх
SlaUr
Дата 16.12.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насколько я понимаю загрузить файл на сервер можно только на ftp-сервер

Код

uses wininet;
var FtpHandle,InetHandle: HInternet;

Function CopyFileFtp(inp,outp:string):Boolean;
begin
Result:=False;
InetHandle := InternetOpen(PChar('FTP'), 0, nil, nil, 0);
   FtpHandle := InternetConnect(InetHandle, PChar(ftp_name), 21, PChar(login),
       PChar(password), INTERNET_SERVICE_FTP, 0, 255);
    if not Assigned(FtpHandle) then
    begin
     InternetCloseHandle(InetHandle)
      Exit;
    end  else

    try
       if FtpPutFile(FtpHandle, PChar(inp), PChar(outp),
       FTP_TRANSFER_TYPE_BINARY, 255) then Result:=True ;
       except
    end;
 InternetCloseHandle(InetHandle);
end;




Это сообщение отредактировал(а) SlaUr - 16.12.2009, 10:11
PM MAIL   Вверх
profesiachuvak
Дата 16.12.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

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



Может быть Вам будет полезно. Пример кода как подключиться к ftp и скачать с него файл :
Код



  The following function shows how to connect to a ftp server 
  and download a file. 
  It uses the functions from wininet.dll. 

  You need a ProgressBar to show the progress and a Label to show progress informations. 


uses 
  WinInet, ComCtrls; 

function FtpDownloadFile(strHost, strUser, strPwd: string; 
  Port: Integer; ftpDir, ftpFile, TargetFile: string; ProgressBar: TProgressBar): Boolean; 

  function FmtFileSize(Size: Integer): string; 
  begin 
    if Size >= $F4240 then 
      Result := Format('%.2f', [Size / $F4240]) + ' Mb' 
    else 
    if Size < 1000 then 
      Result := IntToStr(Size) + ' bytes' 
    else 
      Result := Format('%.2f', [Size / 1000]) + ' Kb'; 
  end; 

const 
  READ_BUFFERSIZE = 4096;  // or 256, 512, ... 
var 
  hNet, hFTP, hFile: HINTERNET; 
  buffer: array[0..READ_BUFFERSIZE - 1] of Char; 
  bufsize, dwBytesRead, fileSize: DWORD; 
  sRec: TWin32FindData; 
  strStatus: string; 
  LocalFile: file; 
  bSuccess: Boolean; 
begin 
  Result := False; 

  { Open an internet session } 
  hNet := InternetOpen('Program_Name', // Agent 
                        INTERNET_OPEN_TYPE_PRECONFIG, // AccessType 
                        nil,  // ProxyName 
                        nil, // ProxyBypass 
                        0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE 

  { 
    Agent contains the name of the application or 
    entity calling the Internet functions 
  } 


  { See if connection handle is valid } 
  if hNet = nil then 
  begin 
    ShowMessage('Unable to get access to WinInet.Dll'); 
    Exit; 
  end; 

  { Connect to the FTP Server } 
  hFTP := InternetConnect(hNet, // Handle from InternetOpen 
                          PChar(strHost), // FTP server 
                          port, // (INTERNET_DEFAULT_FTP_PORT), 
                          PChar(StrUser), // username 
                          PChar(strPwd),  // password 
                          INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher? 
                          0, // flag: 0 or INTERNET_FLAG_PASSIVE 
                          0);// User defined number for callback 

  if hFTP = nil then 
  begin 
    InternetCloseHandle(hNet); 
    ShowMessage(Format('Host "%s" is not available',[strHost])); 
    Exit; 
  end; 

  { Change directory } 
  bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir)); 

  if not bSuccess then 
  begin 
    InternetCloseHandle(hFTP); 
    InternetCloseHandle(hNet); 
    ShowMessage(Format('Cannot set directory to %s.',[ftpDir])); 
    Exit; 
  end; 

  { Read size of file } 
  if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then 
  begin 
    fileSize := sRec.nFileSizeLow; 
    // fileLastWritetime := sRec.lastWriteTime 
  end else 
  begin 
    InternetCloseHandle(hFTP); 
    InternetCloseHandle(hNet); 
    ShowMessage(Format('Cannot find file ',[ftpFile])); 
    Exit; 
  end; 

  { Open the file } 
  hFile := FtpOpenFile(hFTP, // Handle to the ftp session 
                       PChar(ftpFile), // filename 
                       GENERIC_READ, // dwAccess 
                       FTP_TRANSFER_TYPE_BINARY, // dwFlags 
                       0); // This is the context used for callbacks. 

  if hFile = nil then 
  begin 
    InternetCloseHandle(hFTP); 
    InternetCloseHandle(hNet); 
    Exit; 
  end; 

  { Create a new local file } 
  AssignFile(LocalFile, TargetFile); 
  {$i-} 
  Rewrite(LocalFile, 1); 
  {$i+} 

  if IOResult <> 0 then 
  begin 
    InternetCloseHandle(hFile); 
    InternetCloseHandle(hFTP); 
    InternetCloseHandle(hNet); 
    Exit; 
  end; 

  dwBytesRead := 0; 
  bufsize := READ_BUFFERSIZE; 

  while (bufsize > 0) do 
  begin 
    Application.ProcessMessages; 

    if not InternetReadFile(hFile, 
                            @buffer, // address of a buffer that receives the data 
                            READ_BUFFERSIZE, // number of bytes to read from the file 
                            bufsize) then Break; // receives the actual number of bytes read 

    if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then 
      BlockWrite(LocalFile, buffer, bufsize); 
    dwBytesRead := dwBytesRead + bufsize; 

    { Show Progress } 
    ProgressBar.Position := Round(dwBytesRead * 100 / fileSize); 
    Form1.Label1.Caption := Format('%s of %s / %d %%',[FmtFileSize(dwBytesRead),FmtFileSize(fileSize) ,ProgressBar.Position]); 
  end; 

  CloseFile(LocalFile); 

  InternetCloseHandle(hFile); 
  InternetCloseHandle(hFTP); 
  InternetCloseHandle(hNet); 
  Result := True; 
end;




--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
Zlo
  Дата 17.12.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нет, ребята фал нужно грузить по HTTP, ну тоже самое, что вы скажем заходите на рапиду и грузите на нее файл.
PM MAIL   Вверх
SlaUr
Дата 18.12.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насколько я понимаю по http можно только читать файлы а загрузить на сервер программно нельзя (на рапиде файл принимает сам сервер)

Это сообщение отредактировал(а) SlaUr - 18.12.2009, 09:38
PM MAIL   Вверх
1000000dollars
Дата 18.12.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



По HTTP залить файл можно. Чтобы это сделать надо разобраться как работает http и если я правильно помню особое внимание уделить методу POST.

Деталей сейчас уже не помню, так что ничего более конкретного подсказать не могу.
PM MAIL   Вверх
profesiachuvak
Дата 19.12.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

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



Цитата(SlaUr @  18.12.2009,  09:37 Найти цитируемый пост)
Насколько я понимаю по http можно только читать файлы а загрузить на сервер программно нельзя (на рапиде файл принимает сам сервер)


SlaUr, Ну вообщем можно. Например загрузить картинку на страничку. Используя протокол http картинка загружается на сервер.

Цитата

Передача параметров скрипту должна осуществляться методом POST


Но как это сделать на delphi вопрос интересный. Про ftp информации уйма.


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
pegorov
Дата 19.12.2009, 17:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Поставьте какой-нибудь сниффер, загрузите файл на webfile.ru через браузер, отснифайте, что он передает и как, после чего воспроизведите эти же действия в дельфи
PM MAIL   Вверх
Zlo
  Дата 21.12.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(pegorov @  19.12.2009,  17:27 Найти цитируемый пост)
Поставьте какой-нибудь сниффер, загрузите файл на webfile.ru через браузер, отснифайте, что он передает и как, после чего воспроизведите эти же действия в дельфи 

Да ну это епонцу ясно smile
Вопрос в том как это сделать? 
Я тут почитал кое что и выходит, что дело это передается методом пост, на днях будет время -поэксперементирую, отпишусь smile
PM MAIL   Вверх
profesiachuvak
Дата 22.12.2009, 00:35 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

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



Цитата(Zlo @  21.12.2009,  23:20 Найти цитируемый пост)
Я тут почитал кое что и выходит, что дело это передается методом пост,


Я тут ссылочку нашёл насчёт вашей темы, там немного и про метод post есть: 

Загрузка файлов по http


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
AntonN
Дата 22.12.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



найдите Synapse, это библиотека юнитов для работы с сетью (имхо лучше инди), в ней есть пример http_demo, в котором просто запрашивается странича по адресу, отправляются данные POSTом, пример отправки файла через POST с кодированием "multipart/form-data".
Конкретно для сабжа нужно сначала отпарсить страничку на которой будет поле выбора файла, вероятно там будет каптча (не смотрел, не знаю), каптчу можно скачать и показать в Image. Затем отправляется POST с закодированным файлом и параметрами катчи (нужные поля можно глянуть прям в html, для формы в которой находится поле отправки файла), по окончании страничка вновь запрашивается чтобы узнать закачался файл или нет.

PS Советчикам снифера большой привет, и пожелание в новом году самим попробывать отсниферить работу браузера.


--------------------
user posted image
PM MAIL WWW   Вверх
Zlo
Дата 22.12.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(AntonN @  22.12.2009,  13:09 Найти цитируемый пост)
найдите Synapse, это библиотека юнитов для работы с сетью (имхо лучше инди), в ней есть пример http_demo, 

Угумс, знаю пробегало тут на форуме с год или два назат, но надо на WinInet
PM MAIL   Вверх
Zlo
Дата 20.1.2010, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(AntonN @  22.12.2009,  13:09 Найти цитируемый пост)
найдите Synapse, это библиотека юнитов для работы с сетью (имхо лучше инди), в ней есть пример http_demo, в котором просто запрашивается странича по адресу, отправляются данные POSTом, пример отправки файла через POST с кодированием "multipart/form-data".

Спасибо!

так, на всякий случай ссылка: 
http://www.delphi.int.ru/articles/49
PM MAIL   Вверх
M1ndAction
Дата 21.1.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как я понял, вам надо на WinInet, в таком случае ничего конкретного к вышесказанному добавить не могу, но если будете делать с помощью Indy, то есть очень удобный инструмент для загрузки файлов: TIdMultiPartFormDataStream:

Код

...
var
  data: TIdMultiPartFormDataStream;
begin
  ...
  data := TIdMultiPartFormDataStream.Create;
  data.AddFormField('uploadId', uploadid);
  data.AddFormField('Empty', '');
  data.AddFile('file_0', FilePath, 'audio/mpeg');
  resultpage := idPost.Post(link, data);
  data.Free;
end;



P.S. smile
Цитата

PS Советчикам снифера большой привет, и пожелание в новом году самим попробывать отсниферить работу браузера.

А в чем проблема? Всегда все в порядке было, понятно, что весьма полезно посмотреть исходный код страницы, но тем не менее снифферы еще ни разу не подводили (пользуюсь обычно Http Analyzer и плагином Firebug для Firefox).
PM MAIL   Вверх
Zlo
Дата 22.2.2010, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ребята ктонить может подсказать как это сделать на WinApi?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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