Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Сохранение файла из потока   Найти похожие ветки 

 
Дмитрий   (2012-03-12 01:24) [0]

Добрый вечер.
Использую IdhttpProxyServer.
Задача сохранить все картинки проходящие через прокси на локальный диск.
На сколько понимаю картинки проходящие через прокси надо отлавливать в событии OnHTTPDocument в потоке VStream: TStream.

Пробую так но ничего не выходит. Подскажите что не правильно делаю.


procedure TForm1.test(ASender: TIdHTTPProxyServer; const ADocument: String;
 var VStream: TStream; const AHeaders: TIdHeaderList);

var
 Stream2: TFileStream;
 IntBuf: array[0..9] of Integer;
begin

 if(Pos(".gif",ADocument)>0) then
   begin

     Stream2 := TFileStream.Create("1.gif", fmOpenWrite);
     Stream2.Seek(0, soFromEnd);
     Stream2.CopyFrom(VStream, VStream.Size);
     Stream2.Free;

   end;

end;


 
Ega23 ©   (2012-03-12 01:41) [1]

1. fmCreate ?
2. А нафига Seek ?


 
Дмитрий   (2012-03-12 01:56) [2]

Файл создался но полностью пустой :(


 
KilkennyCat ©   (2012-03-12 03:19) [3]


> 2. А нафига Seek ?

видел я такой пример в сети...


> Дмитрий   (12.03.12 01:24)  

где будет "голова винчестера" после выполнения Stream2.Seek(0, soFromEnd); ?


 
KilkennyCat ©   (2012-03-12 03:22) [4]


> Дмитрий   (12.03.12 01:56) [2]
>
> Файл создался но полностью пустой :(

и еще вопрос. что будет при TFileStream.Create("1.gif", fmCreate); если файл уже есть?


 
Дмитрий   (2012-03-12 03:41) [5]

Не понятно что за тестирование. Но я сделал по совету Ega23. Убрал seek и заменил fmOpenWrite на fmCreate or fmOpenWrite. Результат не изменился.


 
Anatoly Podgoretsky ©   (2012-03-12 08:20) [6]

> Дмитрий  (12.03.2012 03:41:05)  [5]

Seek убирать нельзя


 
stas ©   (2012-03-12 14:41) [7]

Дмитрий   (12.03.12 03:41) [5]
А чему равен VStream.Size ?


 
sniknik ©   (2012-03-12 15:03) [8]

> А чему равен VStream.Size ?
нулю естественно, т.к. данные еще не получены.


 
stas ©   (2012-03-12 15:42) [9]

И почему var VStream: TStream; ?


 
Дмитрий   (2012-03-12 17:44) [10]


> И почему var VStream: TStream; ?


Потому что в IndyHttpProxyServer так )
Пробую так. То файл записывается то не записывается....


function PosR2L(): String;

 function InvertS(const S: string): string;

 var
   i, Len: Integer;
 begin
   Len := Length(S);
   SetLength(Result, Len);
   for i := 1 to Len do
     Result[i] := S[Len - i + 1];
 end;

var
 ps: Integer;
begin

 ps := Pos(InvertS("/"), InvertS(b));

 if ps <> 0 then
   begin
   ps:=Length(b) - Length("/") - ps + 3;
   Result := Copy(b,ps,Length(b));
   Delete(b, ps, Length(Result) + 1);
   end  else
   Result := "0";
end;

procedure TForm1.test(ASender: TIdHTTPProxyServer; const ADocument: String;
 var VStream: TStream; const AHeaders: TIdHeaderList);
var
FS   :    TFileStream;
i:String;
begin

if(Pos(".gif",ADocument)>0) or (Pos(".jpg",ADocument)>0) or (Pos(".swf",ADocument)>0) or (Pos(".js",ADocument)>0) or (Pos(".css",ADocument)>0) or (Pos(".png",ADocument)>0) or (Pos(".xml",ADocument)>0)  then
 begin
 b:=ADocument;
 i := PosR2L();

 b:=StringReplace(b, "/", "\",[rfReplaceAll]);
   mmo1.Lines.Add("C:\Users\carlson\Desktop\1"+b+i);
 if not DirectoryExists("C:\Users\carlson\Desktop\1"+b) then
   ForceDirectories("C:\Users\carlson\Desktop\1"+b);

 if not FileExists("C:\Users\carlson\Desktop\1"+b+i) then
   begin
    if (VStream.Size > 100000) then
     Begin
           ShowMessage("1");
       FS := TFileStream.Create("C:\Users\carlson\Desktop\1"+b+i, fmCreate);
       FS.CopyFrom(VStream, VStream.Size);
       FS.Free;
      End;
   end;
 end;
end;


 
stas ©   (2012-03-12 18:00) [11]

Потому что в IndyHttpProxyServer так )
Возможно это ошибка, но если var, то подразумевается, что VStream примет значение.
>То файл записывается то не записывается....
Я так понимаю если VStream.Size > 100000, то записывается  иначе - нет.


 
Дмитрий   (2012-03-12 18:09) [12]


> Потому что в IndyHttpProxyServer так )
> Возможно это ошибка, но если var, то подразумевается, что
> VStream примет значение.
> >То файл записывается то не записывается....
> Я так понимаю если VStream.Size > 100000, то записывается
>  иначе - нет.

Не знаю. Поставил последний инди. Там было так когда создаешь событие OnHttpDocument.
А насчет размера. Если ставлю размер 1000 то все равно то записывается то не записывается.


 
stas ©   (2012-03-12 18:21) [13]

Выводите в ListBox имя файла + размер что получится?


 
Дмитрий   (2012-03-12 18:22) [14]

В общем все оказалось проще чем есть) Дело в том что я тестировал на FF это дело. А он как любой нормальный браузер кеширует и повторно не загружает с сервера. Из-за чего через прокси не проходили данные и не происходила запись в файл))



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.075 c
15-1352775498
Abcdef123
2012-11-13 06:58
2013.03.22
Современные тенденции пользовательского интерфейса


15-1335247067
99999
2012-04-24 09:57
2013.03.22
Проверить синтаксис.


15-1344019767
popoko
2012-08-03 22:49
2013.03.22
google map


2-1342945485
Ярослав
2012-07-22 12:24
2013.03.22
Склейка формы


2-1340372027
LDV
2012-06-22 17:33
2013.03.22
frag&amp;drop