2009-05-29 9 views
7

Tôi đang cố gắng để có được một hình ảnh từ một máy chủ HTTP bằng cách sử dụng Perl.Tại sao tải xuống hình ảnh của tôi với LWP của Perl cho tôi tệp có kích thước sai?

Tôi có URL đầy đủ của tập tin và đang cố gắng sử dụng

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

Bây giờ, một cách logic, với tôi ít nhất, điều này sẽ làm việc. Nhưng các tệp có kích thước hơi khác nhau và tôi không thể giải thích tại sao.

Trợ giúp!

+0

gì kích thước chúng là gì? – chaos

+0

Vấn đề duy nhất là các tệp có kích thước khác nhau? Làm thế nào nhẹ là nhẹ? Hình ảnh đang được gửi tới người dùng giống như hình ảnh trên máy chủ của bạn? –

+0

một hình ảnh 20k bị tắt khoảng 30 byte. Dave Hinton giải quyết vấn đề. Tôi đã không chạy trong binmode. – Xetius

Trả lời

14

Bạn cần sử dụng binmode để ghi dữ liệu hình ảnh vào đĩa đúng cách.

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

Nếu không thì nó được hiểu là văn bản và dòng mới bị cắt.

+0

Tôi biết nó phải là một cái gì đó đơn giản. – Xetius

+2

Bạn không cần một tập tin toàn cầu treo xung quanh như thế. Sử dụng File :: Slurp's write_file hoặc LWP :: Simple :: getstore. –

+0

Tôi tìm thấy dấu kiểm màu xanh lá cây lớn ngay bên cạnh binmode vui. – ysth

13

Dave đúng, bạn nên/phải đặt xử lý tệp của mình ở chế độ nhị phân. Nhưng bạn có thể làm tất cả những gì trong một đi:

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