Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Цикл, TMemoryStream и TIdHTTP


Автор: Viy_2007 16.7.2008, 02:07
Доброго времени суток.

Проблема заключается в следующем: в цикле пытаюсь перебирать файлы и качать через IdHTTP. Небольшие файлы качаются без проблем, файлы же большие качаются все с фиксированным размером приблизительно в 1 999 888 Б. В чём может быть проблема? Ниже привожу код.

Код

 for i :=Filess.Count - 1 downto 0 do
 begin
     PostParams.Clear;
     PostParams.Add('kuka=' + CurrentServer.Cookie);
     PostParams.Add('dir=' + Files[i].ServerDir);
     PostParams.Add('filename=' + Files[i].FileName);
     Stream := TMemoryStream.Create;
     try
       HTTP.Post(CurrentServer.URL, PostParams, Stream);
       if Stream.Size <> 0 then
       begin
           Stream.SaveToFile(Files[i].FileName);
           Filess.Delete(i);
       end;
     finally
       Stream.Free;
     end;
 end;


Думаю, что наплужил при работе с TMemoryStream...
За ранее спасибо...

Автор: Viy_2007 16.7.2008, 09:27
Никто ничего не подскажет?

Автор: Alkash 16.7.2008, 09:31
Если можно - откуда качаешь файлы.

Автор: Viy_2007 16.7.2008, 09:43
На данный момент - с локального веб-сервера... Помоему в моей проблеме это не столь важно...

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

Автор: Alkash 16.7.2008, 09:52
Незнаю на чём пробовать, а без пробы - не могу сказать ничего конкретного.

Автор: Viy_2007 16.7.2008, 10:20
Вот пример скрипта:

Код

<?php

$file_ = $_POST['dir']."/".$_POST['filename'];
out_file($file_);
 
function out_file($file1){
  header ("Content-Type: application/octet-stream");
  header ("Accept-Ranges: bytes");
  header ("Content-Length: ".filesize($file1)); 
  header ("Content-Disposition: attachment; filename=".$file1);  
  readfile($file1);
}

?>

Автор: Viy_2007 16.7.2008, 12:28
Никто не сталкивался с этой проблемой???

Автор: Snowy 16.7.2008, 12:29
А зачем ты качаешь в TMemoryStream?
Качай сразу в TFileStream.
А в память больше 2 гигов ты не засунишь.
По крайней мере, пока не скомпилишь свою прогу в 64-битную.
А ты этого пока не можешь ;-)

Автор: Viy_2007 16.7.2008, 13:14
Прикол заключается в том, что я тестил на файлах далеко не в 2 Гб (около 150 Мб), это во-первых, а во-вторых, я уже пробовал и с TFileStream, там ситуация такая: в процессе скачивания видно что файл приходит и сохраняется полностью, а затем, при скачивании следующего файла, размер предыдущему опять выставляется объёмом в 2 метра (приблизительно). Этого я вообще понять не могу, как может измениться старый файл, если стрим для него я уже освободил (Stream.Free), а для нового создал новый стрим??? Я даже пытался сохранять файл локально, а затем перемещать его куда надо (чтобы стрим от него отвязался), но при таком раскладе и после освобождения стрима выдавало ошибку: "Данный файл уже используется..."... Даже не знаю что ещё придумать (

Автор: aktuba 16.7.2008, 14:03
Выложи тестовый проект (delphi + php). Так трудно ответить, т.к. не понятно как формируются названия файлов, как передаются параметы и т.д...

Автор: Viy_2007 16.7.2008, 15:37
Эх, ну ладно.
Допустим вот такой юнит:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  Filess, PostParams: TStringList;
  HTTP: TIdHTTP;
  Stream: TMemoryStream;
begin
  Filess := TStringList.Create;
  Filess.Add('D736EB7173364D269769267398F2043A46C551C319F9457B8D14B0BF2C2C45F0');
  Filess.Add('84C82A708CCB4B6C975178318EA9CECE6CBBDB71334D41448771627892BD281A');
  Filess.Add('5F3D9A0A038E432CBAC9F7BE32998D66124A14146DB645A28884E62164C6DEB5');
  PostParams := TStringList.Create;
  HTTP := TIdHTTP.Create(Form1);
  for i := Filess.Count - 1 downto 0 do
  begin
     PostParams.Clear;
     PostParams.Add('kuka=71B9160192584F26977CC9B8A58FB156');
     PostParams.Add('dir=/Elements');
     PostParams.Add('filename=' + Filess.Strings[i]);
     Stream := TMemoryStream.Create;
     try
       HTTP.Post('http://test2.ru/getfiles.php', PostParams, Stream);
       if Stream.Size <> 0 then
       begin
         Stream.SaveToFile(Filess.Strings[i]);
         Filess.Delete(i);
       end;
     finally
       Stream.Free;
     end;
  end;
  HTTP.Free;
  Filess.Free;
  PostParams.Free;
end;

end.


И вот такой скрипт:
Код

<?php

$HomeDir = "D:/Server/home/test2.ru/www";
$KukaS = "71B9160192584F26977CC9B8A58FB156";

if ((isset($_POST['kuka'])) & (isset($_POST['filename'])) & (isset($_POST['dir']))){
  if ($_POST['kuka'] == $KukaS) {
    $file_ = $HomeDir.$_POST['dir']."/".$_POST['filename'];
    if (file_exists($file_)) {      
      out_file($file_);
    }
  }
}  


function out_file($file1){
  header ("Content-Type: application/octet-stream");
  header ("Accept-Ranges: bytes");
  header ("Content-Length: ".filesize($file1)); 
  header ("Content-Disposition: attachment; filename=".$file1);  
  readfile($file1);
}

?>


При скачивании файлов от 2х метров у меня выставляется им объём фиксированно 1 999 888... Может и файлы выложить которые качал? )
Я больше чем уверен что тут проблема не в формировании имён файлов, или передачи параметров...

Автор: aktuba 16.7.2008, 16:48
Цитата(Viy_2007 @  16.7.2008,  16:37 Найти цитируемый пост)
function out_file($file1){
  header ("Content-Type: application/octet-stream");
  header ("Accept-Ranges: bytes");
  header ("Content-Length: ".filesize($file1)); 
  header ("Content-Disposition: attachment; filename=".$file1);  
  readfile($file1);
}


Я почему-то думаю, что проблема тут. Приду вечером - проверю и отпишу.

Автор: Viy_2007 16.7.2008, 17:14
А я так не думаю, т.к., повторюсь, при использовании TFileStream в определенный момент видно, что файлы скачиваются один в один...
Да и не логично это совсем )

Автор: MetalFan 16.7.2008, 20:55
какая версия индейцев? если из поставки делфи - срочно обновляться.

Автор: Viy_2007 16.7.2008, 22:48
Обновился до 10х индейцев - не помогло... А кто-нибудь пробовал у себя этот код? Может у меня с машиной чего...

Автор: MetalFan 17.7.2008, 08:58
Цитата(Viy_2007 @  16.7.2008,  22:48 Найти цитируемый пост)
Обновился до 10х индейцев - не помогло... 

полный номер версии? должно быть не ниже 10.2.3

Автор: Viy_2007 17.7.2008, 17:10
Эээ, 10.1.5... А где скачать 10.2.3? Никак найти не могу... (
Если можешь, намыль пожалуйста - viy_2007_@inbox.ru

Автор: MetalFan 18.7.2008, 09:35
на сайте индейцев - http://indyproject.org/Sockets/Docs/Indy10Installation.EN.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)