2013-03-08 40 views
5

Cần một số tập lệnh cgi-perl có thể tải xuống tệp từ máy chủ. EX: nhấp vào liên kết tải xuống và nó sẽ mở cửa sổ "lưu dưới dạng" và sẽ cho phép tôi lưu tệp trên máy cục bộ của mình.Perl CGI để tải xuống tệp qua trình duyệt web

Tôi đã tạo một trang web bằng CGI, bằng cách này tôi sẽ tải tệp lên máy chủ và chạy tập lệnh perl để chuyển đổi sang định dạng khác (cho đến khi tôi hoàn thành). Bây giờ tôi cần lấy lại tệp này (tải xuống lại) cho hệ thống.

#!/usr/bin/perl 
#print "Content-type: text/html\n\n"; 
my $filepath='/upload/testing.pm'; 

    print "Content-Type: text/html\n\n"; 

    open("DOWNLOADFILE", "<".$filePath); 
    while($fileContents = <DOWNLOADFILE>) { 
     print $fileContents; 
    } 
print "Content-Type: text\n"; 
print "Content-Disposition: attachment; filename='testing.pm'\n"; 
print "Content-Description: File to download\n\n"; 
    close DOWNLOADFILE; 

Tải lên một tập tin từ máy tính của tôi (client) vào máy máy chủ, nơi tôi có một kịch bản perl mà sẽ chuyển đổi các tập tin sang định dạng khác và sẽ lưu các tập tin mới được chuyển đổi sang một thư mục ví dụ:/upload-> cho đến đây tôi đã làm xong với kịch bản.

Bây giờ tôi cần tải xuống tệp này về máy khách bằng trình duyệt. Trong trường hợp này, tôi đã cố tải xuống tệp testing.pm về máy khách.

+0

Bạn đã thử những gì? Nó không phải là cách cư xử thực sự tốt để yêu cầu mã –

+0

cảm ơn Robert cho câu trả lời .... Tôi đã cập nhật mã trong câu hỏi chính mà tôi đã cố gắng ... xin vui lòng có một cái nhìn. – Tanuj

Trả lời

5

Sắp xếp lại các tiêu đề HTML đã hoạt động. đây là tập lệnh làm việc. người ta có thể sử dụng nó vì nó là

use CGI; 
my $html= new CGI; 
#get the file name from URL ex. http://<server_IP>/cgi-bin/download.cgi?a=testing.txt 
my $file= $html->param('a'); 
# $file is nothing but testing.txt 
my $filepath= "/var/www/upload/$file"; 

print ("Content-Type:application/x-download\n"); 
print "Content-Disposition: attachment; filename=$file\n\n"; 

open FILE, "< $filepath" or die "can't open : $!"; 
binmode FILE; 
local $/ = \10240; 
while (<FILE>){ 
    print $_; 
} 

    close FILE; 
# use Unlink if u want to delete the files after download. 
#unlink ($filepath); 
+0

Oh. Tôi không biết bạn có thể chấp nhận câu trả lời của riêng bạn. Điều đó có vẻ ... bị hỏng. –

+1

Bây giờ sửa lỗi cung cấp cho một cracker truy cập vào tất cả các mật khẩu trên máy chủ của bạn - http://mag-sol.com/articles/cgi2.html –

+0

@DaveCross Bạn có thể giải thích lỗi đó là gì bởi vì liên kết đó đã chết. – CJ7

3

Tôi nghĩ bạn vừa đánh vần tiêu đề bố cục nội dung của mình sai. Nó phải là "tập tin đính kèm", không phải "đính kèm".

Update (sau bình luận dưới đây):

Ok, do đó tìm kiếm thêm Tôi thấy rằng bạn đang in một tiêu đề CGI (Content-Type: text/html) tiếp theo là hai dòng mới và sau đó, sau này, in nhiều tiêu đề CGI hơn và mong đợi trình duyệt chú ý đến chúng. Dòng trống đầu tiên trong câu trả lời của bạn sẽ cho trình duyệt biết rằng các tiêu đề đã hoàn tất. Vì vậy, hàng loạt tiêu đề thứ hai của bạn sẽ chỉ được xem là nội dung.

Tôi cũng thấy rằng bạn đang in nội dung của tệp trước bộ tiêu đề thứ hai của bạn. Mà sẽ làm cho họ chân trang chứ không phải là tiêu đề :-)

Bạn cần đặt lại mã của mình để bạn chỉ trả về một bộ tiêu đề. Và sau đó bạn trả lại dữ liệu.

+0

chính xác của nó trong mã, tôi tin rằng trong khi sao chép dán mã từ IDE của tôi đến đây tôi đã làm sai .. – Tanuj

+0

Đã dành một chút thời gian để hiểu tiêu đề HTML để tải xuống tệp .. Cảm ơn Dave đã đề xuất giải pháp .. tôi đã cập nhật viết kịch bản xuống ... – Tanuj

Các vấn đề liên quan