2013-03-08 2 views
5

Sono necessari alcuni script cgi-perl che possono scaricare un file da un computer server. EX: clicca su un link per il download e si aprirà una finestra "Salva con nome" e mi consentirà di salvare il file sul mio computer locale.Perl CGI per scaricare un file tramite browser web

Ho creato una pagina Web utilizzando CGI, utilizzando questo caricherò un file sul server e verrà eseguito uno script perl per convertirlo in un altro formato (fino a qui ho finito). Ora ho bisogno di recuperare questo file (download indietro) nel sistema.

#!/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; 

Caricare un file dalla mia macchina (client) per computer server, dove ho uno script perl che convertirà il file in un altro formato e salverà il file appena convertito in un dir es:/di upload> fino a qui ho finito con lo scripting.

Ora ho bisogno di scaricare questo file sul computer client tramite browser. In questo caso stavo cercando di scaricare il file testing.pm sul computer client.

+0

Che cosa hai già provato? Non è davvero buona educazione chiedere il codice –

+0

grazie Robert per la risposta .... Ho aggiornato il codice nella domanda principale che stavo cercando ... per favore date un'occhiata. – Tanuj

risposta

5

Il riposizionamento delle intestazioni HTML ha funzionato. ecco lo script di lavoro. si può usare così com'è

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. Non sapevo che potessi accettare la tua risposta. Sembra ... rotto. –

+1

Ora correggi il bug che dà a un cracker l'accesso a tutte le password sul tuo server - http://mag-sol.com/articles/cgi2.html –

+0

@DaveCross Puoi spiegare che cosa è quel bug perché quel link è morto. – CJ7

3

Penso che tu abbia appena digitato l'intestazione Content-Disposition errata. Dovrebbe essere "attaccamento", non "attachement".

aggiornamento (segue commento qui sotto):

Ok, quindi guardando più vedo che si sta stampando un'intestazione CGI (Content-Type: text/html) seguito da due nuove righe e poi, più tardi, stampando più intestazioni CGI e aspettando che il browser li noti. La prima riga vuota nella tua risposta dirà al browser che le intestazioni sono finite. Quindi il tuo secondo gruppo di intestazioni sarà visto come contenuto.

Vedo anche che si sta stampando il contenuto del file prima del il secondo set di intestazioni. Il che li renderebbe piè di pagina piuttosto che intestazioni :-)

È necessario riordinare il codice in modo da restituire solo un set di intestazioni. E poi restituisci i dati.

+0

è corretto nel codice, credo mentre copiando il codice del mio IDE qui ho sbagliato .. – Tanuj

+0

Ho passato un po 'di tempo a capire le intestazioni HTML per scaricare un file .. Grazie a Dave per aver suggerito la soluzione .. ho aggiornato il sceneggiatura di lavoro in basso ... – Tanuj