Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2014, 00:15   #1
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию загрузка с отобр.прогреса файла из интернета

люди добрые дайте рабочий код по загрузке файла из интернета делаю следующим образом, файл ~5мб , загружает только 2кб

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

Код:
unit Updates;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,httpsend,Wininet, Vcl.ComCtrls,
  acProgressBar,  Vcl.StdCtrls;

type
  TForm4 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    sProgressBar1: TsProgressBar;
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
      procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;



var
  Form4: TForm4;
    URL, FN: string;
   version: string;
implementation

{$R *.dfm}

function GetInetFile(const fileURL, FileName: string): boolean;
const
  BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: file;
  sAppName: string;
begin
  Result:=False;
  sAppName := ExtractFileName(Application.ExeName);
  hSession := InternetOpen(PChar(sAppName),
  INTERNET_OPEN_TYPE_PRECONFIG,
  nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession,
    PChar(fileURL),
    nil,0,0,0);
    try
      AssignFile(f, FileName);
      Rewrite(f,1);
      repeat
        InternetReadFile(hURL, @Buffer,
        SizeOf(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen)
      until
        BufferLen = 0;
      CloseFile(f);
      Result:=True;
    finally
      InternetCloseHandle(hURL)
    end;
  finally
    InternetCloseHandle(hSession)
  end;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
HTTP: THTTPSend;
HTML: TStringlist;
begin
HTML:= TStringlist.Create;
HTTP:= THTTPSend.Create;
HTTP.HTTPMethod('GET', 'http://the-best.clan.su/version.txt');
HTML.LoadFromStream(HTTP.Document);

if pos(version, HTML.Text)<>0 then
begin
Memo1.Lines.Add('Обновления не обнаружены');
end else
begin
Memo1.Lines.Add('Обновления обнаружены');
Memo1.Lines.Add('Началась скачка файла');

URL := 'wwwww';
FN := 'Project1.exe';


if GetInetFile(URL, FN) then
begin
Memo1.Lines.Add('Файл успешно скачан в папку с проектом');
end else
begin
Memo1.Lines.Add('Ошибка');
end;

end;

end;

procedure TForm4.FormCreate(Sender: TObject);
begin
version :='1.2';
end;



end.
casio23 вне форума Ответить с цитированием
Старый 08.03.2014, 06:59   #2
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

Цитата:
Сообщение от casio23 Посмотреть сообщение
люди добрые дайте рабочий код по загрузке файла из интернета
Не вижу в задаче указания на используемый загрузочный модуль. Вижу в коде синапс, но код не есть задача. Прошу уточнить.
Цитата:
Сообщение от casio23 Посмотреть сообщение
примеры находил но они не рабочие
Примеры не рабочие, или не хватает соображалки применить найденные примеры? Очень часто люди свою безграмотность прикрывают ложными обвинениями в кривости примеров. А это не очень красиво.

P.S. Вопрос на засыпку. Зачем в приведённом коде нужны глобальные переменные URL и FN, если они ни где не используются?
Код:
if GetInetFile('wwwww', 'Project1.exe') then...
Я так понимаю приведённый код, это попытка сделать самообновление приложения из интернета. Используйте реальную версию приложения, которую Вы должны указывать в настройках проекта, а не строковые константы в коде. Особо удобно в таких случаях использовать так называемый билд.

Последний раз редактировалось XE5; 08.03.2014 в 07:15.
XE5 вне форума Ответить с цитированием
Старый 08.03.2014, 13:51   #3
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

Цитата:
Сообщение от XE5 Посмотреть сообщение
Не вижу в задаче указания на используемый загрузочный модуль. Вижу в коде синапс, но код не есть задача. Прошу уточнить.

Примеры не рабочие, или не хватает соображалки применить найденные примеры? Очень часто люди свою безграмотность прикрывают ложными обвинениями в кривости примеров. А это не очень красиво.

P.S. Вопрос на засыпку. Зачем в приведённом коде нужны глобальные переменные URL и FN, если они ни где не используются?
Код:
if GetInetFile('wwwww', 'Project1.exe') then...
Я так понимаю приведённый код, это попытка сделать самообновление приложения из интернета. Используйте реальную версию приложения, которую Вы должны указывать в настройках проекта, а не строковые константы в коде. Особо удобно в таких случаях использовать так называемый билд.

из 5мб скачивается только 2,7 кб Потому что приведенный код кривой. Он работает только на ОЧЕНЬ хорошей линии, ибо предполагается, что передача по сети осуществляется быстрее, чем вы в цикле вычитываете данные из входного буфера. Если линия тонкая или сервак чуть притормозил, то срабатывает "until BufferLen = 0;". По уму нужно внутри ставить цикл ожидания данных while BufferLen = 0... с замером времени и выходом по таймауту, чтоб не зависнуть в ожидании данных навечно.
casio23 вне форума Ответить с цитированием
Старый 08.03.2014, 14:12   #4
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

извиняюсь код рабочий, вот только почему то не пойму почему файлы *.exe не скачивает полностью? файлы *.rar отлично скачивает
casio23 вне форума Ответить с цитированием
Старый 08.03.2014, 17:23   #5
XE5
Заблокирован
 
Регистрация: 02.03.2014
Сообщений: 439
По умолчанию

А я не пойму, почему Вы не ответили на мой вопрос.
Цитата:
Не вижу в задаче указания на используемый загрузочный модуль. Вижу в коде синапс, но код не есть задача. Прошу уточнить.
XE5 вне форума Ответить с цитированием
Старый 09.03.2014, 00:31   #6
casio23
Форумчанин
 
Аватар для casio23
 
Регистрация: 29.12.2010
Сообщений: 186
По умолчанию

Цитата:
Сообщение от XE5 Посмотреть сообщение
А я не пойму, почему Вы не ответили на мой вопрос.
вот изменил для загрузки файла

Код:
function ExtractUrlFileName(url: string): string;
var
  A: LongInt;
begin
  // извлекаем название файла из ссылки
  result := '';
  A := LastDelimiter('/', url);
  if (A > 0) and (url[A] = '/') then
    result := Copy(url, A + 1, Length(url) - A);
end;

function GetInetFileSize(const FileUrl: string): integer;
var
  IdHTTP: TIdHTTP;
begin
  result := -1; // Ставим первоначальное значение -1, потом поймёте зачем
  IdHTTP := TIdHTTP.Create(nil);
  try
    IdHTTP.Head(FileUrl); // Мы получаем только заголовок нашего файла, где хранится размер файла, код запроса и т.п.
    if IdHTTP.ResponseCode = 200 then // Если файл существует, то... (200 это успешный код: HTTP OK)
      result := IdHTTP.Response.ContentLength; // В результат пихаем наш размер файла в байтах.
  except
    IdHTTP.Free;
  end;
end;

procedure TDownload.Execute;
const
  BufferSize = 1024;
var
  stream: TMemoryStream;
  FName: String;
  http: TIdHTTP;
begin
  FName := ExtractFilePath(Application.ExeName)+ ExtractUrlFileName(Form13.ed.Text);
  http := TIdHTTP.Create(nil);
  http.OnWork := OnWork;
  http.OnWorkBegin := OnWorkBegin;
  http.OnWorkEnd := OnWorkEnd;
  stream := TMemoryStream.Create;
  size := GetInetFileSize(Form13.ed.Text); // Узнаём размер файла
  if size > 0 then
    try
      sizes := floattostr(RoundTo(size / (1024 * 1024), -2)); // Переводим в МБ
      Form13.lb2.Caption := 'Размер на сервере: ' + sizes + ' MB.';
      // sizes:=floattostr(RoundTo(size/(1024) , -2)); //Переводим в KB
      http.get(Form13.ed.Text, stream); // Начинаем скачивание
      stream.SaveToFile(FName); // Сохраняем
    except
      FreeAndNil(http); // Завершаем HTTP
      FreeAndNil(stream); // Завершаем Stream
    end
  else
    Showmessage('Ошибка при скачивании файла!'); // Если размер файала меньше 0, то выводим сообщение.
end;

procedure TDownload.OnWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  Form13.gud.Progress := AWorkCount; // Вбимаем кол-во скачанного
  Form13.lb.Caption := 'Всего загружено: ' + floattostr
    (RoundTo(AWorkCount / (1024 * 1024), -2)) + ' MB.';
end;

procedure TDownload.OnWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
  Form13.gud.MaxValue := AWorkCountMax; // За макс. граничей прогресса, у нас будет размер файла
  Form13.bt.Caption := 'Загружаем...';
end;

procedure TDownload.OnWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  Form13.gud.Progress := 0; // После завершения загрузки, прогресс = 0
  Form13.bt.Caption := 'Готово!';
end;

procedure TForm13.btClick(Sender: TObject);
begin
  TDownload.Create(false);
end;
загружает все прекрасно, но exe нет! Почему?подскажите...
Download.part1.rar

Download.part2.rar
casio23 вне форума Ответить с цитированием
Старый 09.03.2014, 01:28   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от casio23 Посмотреть сообщение

загружает все прекрасно, но exe нет! Почему?подскажите...
не юкоз случаем?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка файла из интернета -Jack- Общие вопросы Delphi 4 24.10.2012 19:02
Загрузка файла из интернета с компа, не имеющего "прямого" выхода Xardas Работа с сетью в Delphi 2 30.03.2011 18:02
Загрузка изображения из интернета в программу Crystallon Общие вопросы Delphi 1 12.09.2010 20:21
капча в Image, загрузка из интернета DeDoK Работа с сетью в Delphi 11 30.04.2009 13:57
Загрузка страницы из интернета Лубышев Работа с сетью в Delphi 9 10.03.2009 07:52