Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
Дмитрий   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.062 c
15-1337667020
AV
2012-05-22 10:10
2013.03.22
Oracle/ Надо прибить сессии, использующие пакет


2-1337847952
Bojo
2012-05-24 12:25
2013.03.22
Сократить код


2-1347122752
Тимофей
2012-09-08 20:45
2013.03.22
MS SQL2005 express


15-1350023740
alexdn
2012-10-12 10:35
2013.03.22
Интернет магазины


15-1349683436
AV
2012-10-08 12:03
2013.03.22
Махинации с бразером по умолчанию и обработкой url





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский