30. november 2004 - 17:15 Der er 8 kommentarer og
1 løsning

Gennemtvining af download

Jeg er ved at lave et billede galleri hvori der skal være plads til meget store JPG filer (ca. 7 MB).
Hvordan gennemtvinger man at der popper et "Gem som" vindue op, istedet for at browseren forsøger at vise JPG'en i et vindue?

Jeg har selv forsøgt mig med nedenstående script som kaldes via linket:

<a href="openimage.pl?url=images/pic.jpg">Download</a>               

Dette script virker ca. fint med mindre filer, men med større filer returneres fejlen "Siden kan ikke vises". Når jeg siger "ca. fint" mener jeg at filnavnet den foreslår man skal gemme med er "openimage"?

Hvordan får jeg det hele til at fungerer korrekt?
         
       
openimage.pl:

my $url = "images/pic.jpg"; #Billedet fylder ca. 7 MB

print "HTTP/1.1 200 OK\r\n"; 
print "Content-Disposition: attachment; filename=$url\r\n";

if ($url=~/jpg|jpeg/i) {warn "jpg"; print "Content-Type: image/jpeg\r\n"; };
if ($url=~/gif/i) { warn "gif"; print "Content-Type: image/gif\r\n"; }
if ($url=~/eps/i) { warn "eps"; print "Content-Type: application/postscript\r\n\r\n" }

open my $fh,'<',$url or die ("Error: $!");
binmode $fh;
print <$fh>;
close $fh;
Avatar billede olebole Juniormester
01. december 2004 - 20:25 #1
<ole>

Jeg har ikke en bønne begreb om Perl, men er fulgt med fra:
  http://www.eksperten.dk/spm/566414

Jeg skriver dog PHP og ASP (VBS og JS), så hvis jeg prøver at oversætte noget PHP til Perl, ville jeg forsøge at udvidde din header-sektion lidt:

print "HTTP/1.1 200 OK\r\n"; 
print "Content-Disposition: attachment; filename=$url\r\n";
print "Content-Type: application/octet-stream\r\n";
print "Pragma: no-cache\r\n";
print "Expires: 0\r\n";
print "Cache-Control: no-store\r\n";

/mvh
</bole>
Avatar billede olebole Juniormester
01. december 2004 - 20:30 #2
Jeg ville nok også angive dokumentets størrelse. Det ville i PHP se sådan ud:
  Header( "Content-Length: ".filesize($fName) );

I Perl vil det formodentlig se sådan ud (cirka):
  print "Content-Length: 7000000";

De 7000000 bør du naturligvis lade Perl regne ud (som vist i PHP-eksemplet). I PHP findes funktionen 'filesize()' - men jeg kender ikke en ækvivalent i Perl. Den må du selv finde  :)
01. december 2004 - 20:42 #3
Jeg kender til PHP, så jeg er helt med, men mit kendskab til Header indhold er ikke ret godt. Jeg tester det i morgen.
Avatar billede olebole Juniormester
01. december 2004 - 20:50 #4
Oki  ;o)
Det, der er hele fidusen, er, ikke at give browseren en Content-Type, den genkender som noget, den kan vise. I virkeligheden ville du formodentlig kunne bruge:
  print "Content-Type: snot/bumser\r\n";
... men prøv nu bare:
  print "Content-Type: application/octet-stream\r\n";

... og slet de andre Content-Types, du har  ;o)
Avatar billede xohp Nybegynder
29. juni 2005 - 11:48 #5
use CGI qw/:standard/;
print(header(-type=>'application/octetstream',-length=>length($filecontent)));

bare en lille hjælp :)
20. januar 2006 - 15:24 #6
Nogle gange skal man jo rydde lidt op:) Pointene går til olebole hvis jeg får et svar!
Avatar billede olebole Juniormester
20. januar 2006 - 16:26 #7
Jamen, det gør du da  ;o)
21. januar 2006 - 00:23 #8
Tak for indsatsen!
Avatar billede olebole Juniormester
21. januar 2006 - 04:06 #9
Selvtak ... og tak for points  ;o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester