Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    46

    DOWNLOAD di File .zip con CGI (no redirect)

    Ciao a tutti,

    Devo permettere il download di un file .ZIP tramite CGI tenendo nascosta l'URL quindi ho provato a creare alcune soluzioni che però non danno il risultato desiderato;
    di seguito indico i tentativi ed il loro risultato di seguito, vorrei che qualcuno mi indicasse EVENTUALI ERRORI o altri PROBLEMI che non ho considerato per la mia incompleta conoscenza dell'argomento:



    .1.
    codice:
    #!user/bin/perl
    
    use strict;
    use CGI;
    
    my $cgi = new CGI;
    my $file_size = (stat "download/file.zip")[7];
    
    print $cgi->header( -type=>'application/octet-stream', 
                        -attachment=>'download/file.zip',
                        -Content_length=>$file_size);
    RISULTATI:
    -HTTP:
    Internal Server Error 500
    -SHELL:
    mi Stampa l'HEADER senza problemi
    -Dove è l'errore???



    .2.
    codice:
    #!/usr/bin/perl
    
    use strict;
    
    my $size = (stat "download/file.zip")[7];
    my $buf ='';
    
    open(DATA,"<download/file.zip");
    binmode(DATA);
    read(DATA, $buf, $size);
    print "Content-Type:application\/octet-stream\n\n";
    print $buf;
    close(DATA);
    RISULTATI
    -SHELL:
    Stampa l'HEADER e poi il File seguiti dal PROMPT seguito a sua volta dal nome del client Telnet per circa 30 volte consecutive 'PuTTYPuTTYPuTTYPuTTYPuTTYPuTTY....' tra cui 3 o 4 'PuTTY6c' ???
    -HTTP:
    il Browser Stampa il File senza l'HEADER
    - Tra l'altro Potrebbe dipendere dal mio browser???



    .3.
    Questa è una parte che ho modificato di uno script esistente.
    Notare commento iniziale
    codice:
    #!/usr/local/bin/perl
    #Download a file to a client browser (ignoring plugins and helper apps)
    use strict;
    use warnings;
    my $date = '';
    my $alert_msg = '';
    my $logfile = '';
    my $err = '';
    my $dlfile = 'download/file.zip'; # download file name 
    ######### get the size of the file
    my $size = (stat $dlfile)[7];
    ######### send the file to the client's browser
    select STDOUT;
    $| = 1;
    print "Content-Type: application\/force-download\nContent-Disposition: attachment\; filename=$dlfile\nContent-Length: $size\nContent-Description: File Downloader 0.2\n\n";
    open(FILEIN, $dlfile) or $err = $!;
    if ($err) {
      &js_alert($alert_msg,1,"exit");  # abort if can't open download file
      die;
    }
    binmode FILEIN if (-B $dlfile);  # binary mode if binary file
    my $blksize = (stat FILEIN)[11];  # get file system block size
    if (!$blksize) {
      $blksize = 16384;
    }
    my($read,$buf,$log_entry);
    while ($read = sysread FILEIN, $buf, $blksize) {
      if (!defined $read) {
    	   next if $! =~ /^Interrupted/;
    	   if ($logfile) {
          open LOG, "+>>$logfile" or $err = $!; 
          if (!$err) {
            $log_entry = "$date - System Read Error - $!\n\n";
            print LOG $log_entry;
            close LOG;
            $logfile = 0;
          }
        }
        &js_alert($alert_msg,1,"exit");  # abort - file read error
    	   die;
      }
      my $written = 0;
      my $offset = 0;
      while ($read) {
    	   $written = syswrite STDOUT, $buf, $read, $offset;
        if (!defined($written)) {
      	   if ($logfile) {
            open LOG, "+>>$logfile" or $err = $!; 
            if (!$err) {
              $log_entry = "$date - System Write Error - $!\n\n";
              print LOG $log_entry;
              close LOG;
              $logfile = 0;
            }
          }
          &js_alert($alert_msg,1,"exit");  # abort - file write error
          die;
        }
        $read -= $written;
        $offset += $written;
      }
    }
    ######### finished sending the file
    exit;
    Risultati:
    Stesso risultato della soluzione .2. con l'Header diverso come indicato nel codice.



    Grazie anticipatamente per l'interessamento e la pazienza,
    Ciao,
    zamak

  2. #2
    Ciao,

    se avessi fatto una ricerca avresti scoperto questo tread, che peraltro è in rilievo:

    http://forum.html.it/forum/showthrea...hreadid=435139
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    46
    1. Grazie per la risposta
    2. La ricerca l'avevo fatta (come sempre) ma forse con termini non adatti ('download file' etc...)
    3. Il tuo script funziona,

    Tu usi un header diverso, quindi, stavo per chiederti come mai gli altri headers da me usati non funzionavano, poi li ho riprovati per scrupolo e ora funzionano;
    Hai idea del motivo? io penso sia il mio browser che ha problemi nell'interpretare gli headers; me lo fa pensare anche il fatto che la mascherina per il salvataggio del file propone come nome quello del cgi e non quello definito dall'header 'filename=';


    Sai consigliarmi una risorsa dove sono mostrati e spiegati i diversi headers?

    Grazie 1000 per le tue utili risposte,
    zamak

  4. #4
    Ciao,

    guarda su:

    http://www.cs.tut.fi/~jkorpela/http.html
    http://www.w3.org/Protocols/rfc2616/rfc2616.html

    per quanto riguarda i mancati funzionamenti:

    1--
    direi che si tratta del fatto che nello script annunci solo lheader, ma non scrivi il file nello STDOUT.

    2--
    c'è una \ di troppo, mancano alcuni pezzi dell'header, e anche qui non scrivi tutto il file, mancando il ciclo while.

    3--
    non conosco l'header type che cerca di usare quello script.

    Ciao.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.