2009-05-29 4 views
7

Próbuję uzyskać obraz z serwera HTTP za pomocą Perl.Dlaczego mój obraz pobrany z LWP Perla daje mi plik o niewłaściwych rozmiarach?

mam pełny adres URL pliku i 'm próbuje użyć

my $data = LWP::Simple::get $params{URL}; 
my $filename = "image.jpg"; 
open (FH, ">$filename"); 
print FH $data; 
close (FH); 

Teraz logicznie, przynajmniej dla mnie, to powinno działać. Ale pliki mają nieco inne rozmiary i nie mogę zrozumieć dlaczego.

Pomoc!

+0

Jakie są rozmiary? – chaos

+0

Czy jedynym problemem są różne rozmiary plików? Jak nieznaczne jest niewielkie? Czy obraz przesyłany do użytkownika jest taki sam, jak obraz na serwerze? –

+0

obraz 20k był wyłączony o około 30 bajtów. Dave Hinton rozwiązał problem. Nie biegałem w trybie bin. – Xetius

Odpowiedz

14

Musisz użyć binmode, aby poprawnie zapisać dane obrazu na dysku.

my $data = LWP::Simple::get $params{URL}; 
my $filename = "image.jpg"; 
open (FH, ">$filename"); 
binmode (FH); 
print FH $data; 
close (FH); 

W przeciwnym razie zostanie zinterpretowany jako tekst, a nowe znaki zostaną zniekształcone.

+0

Wiedziałem, że musi to być coś prostego. – Xetius

+2

Nie potrzebujesz globalnego uchwytu plików, który tak się kręci. Użyj File :: Slurp's write_file lub LWP :: Simple :: getstore. –

+0

Znalazłem duży zielony znacznik wyboru obok zabawnego binmode. – ysth

13

Dave ma rację, powinieneś/musisz ustawić uchwyt pliku na tryb binarny. Ale możesz zrobić to wszystko za jednym razem:

LWP::Simple::getstore($params{URL}, 'image.jpg');