![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение файла из потока
Дмитрий © (2012-03-12 01:24:00)Добрый вечер.
Использую 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;
Дмитрий (2012-03-12 18:22:00) [1]В общем все оказалось проще чем есть) Дело в том что я тестировал на FF это дело. А он как любой нормальный браузер кеширует и повторно не загружает с сервера. Из-за чего через прокси не проходили данные и не происходила запись в файл))
stas (2012-03-12 18:21:00) [2]Выводите в ListBox имя файла + размер что получится?
Дмитрий (2012-03-12 18:09:00) [3]
> Потому что в IndyHttpProxyServer так )
> Возможно это ошибка, но если var, то подразумевается, что
> VStream примет значение.
> >То файл записывается то не записывается....
> Я так понимаю если VStream.Size > 100000, то записывается
> иначе - нет.
Не знаю. Поставил последний инди. Там было так когда создаешь событие OnHttpDocument.
А насчет размера. Если ставлю размер 1000 то все равно то записывается то не записывается.
stas (2012-03-12 18:00:00) [4]Потому что в IndyHttpProxyServer так )
Возможно это ошибка, но если var, то подразумевается, что VStream примет значение.
>То файл записывается то не записывается....
Я так понимаю если VStream.Size > 100000, то записывается иначе - нет.
Дмитрий (2012-03-12 17:44:00) [5]
> И почему 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 15:42:00) [6]И почему varVStream: TStream; ?
sniknik (2012-03-12 15:03:00) [7]> А чему равен VStream.Size ?
нулю естественно, т.к. данные еще не получены.
stas (2012-03-12 14:41:00) [8]Дмитрий (12.03.12 03:41) [5]
А чему равен VStream.Size ?
Anatoly Podgoretsky (2012-03-12 08:20:00) [9]> Дмитрий (12.03.2012 03:41:05) [5]
Seek убирать нельзя
Дмитрий (2012-03-12 03:41:00) [10]Не понятно что за тестирование. Но я сделал по совету Ega23. Убрал seek и заменил fmOpenWrite на fmCreate or fmOpenWrite. Результат не изменился.
KilkennyCat (2012-03-12 03:22:00) [11]
> Дмитрий (12.03.12 01:56) [2]
>
> Файл создался но полностью пустой :(
и еще вопрос. что будет при TFileStream.Create('1.gif', fmCreate); если файл уже есть?
KilkennyCat (2012-03-12 03:19:00) [12]
> 2. А нафига Seek ?
видел я такой пример в сети...
> Дмитрий (12.03.12 01:24)
где будет "голова винчестера" после выполнения Stream2.Seek(0, soFromEnd); ?
Дмитрий (2012-03-12 01:56:00) [13]Файл создался но полностью пустой :(
Ega23 (2012-03-12 01:41:00) [14]1. fmCreate ?
2. А нафига Seek ?