Avatar billede mahuni Nybegynder
29. juni 2004 - 12:33 Der er 25 kommentarer og
1 løsning

Hvordan laver jeg downloadssystem?

Jeg ville høre om der var nogen der havde et forslag til hvordan man kan lave et downloadsystem...

Det skal indeholde:

1. Tæller

2. Beskyttelse af stien, så man ikke kan se hvor filen ligger, men i stedet download.php?download=fil.exe eller noget i den dur...

3. Adminsystem...

Jeg har ikke brug for kode til det, bare lige et forslag til hvordan jeg kan lave det... Med mySQL
Avatar billede Slettet bruger
29. juni 2004 - 12:37 #1
Du laver en tabel med følgende felter:

id | fil | hits

Når brugeren trykker på et link, ser det sådan ud:
download.php?get=id

download.php henter så den enkelte fil hvor idét er lig med det fra query.
Derefter ligger den en til i feltet hits, så du har antalet af downloads.
Avatar billede mahuni Nybegynder
29. juni 2004 - 12:44 #2
Men, selvom jeg definerer at fil er lig med www.minside.dk/fil.exe, hvordan får jeg den så til at hente den fil?
Avatar billede Slettet bruger
29. juni 2004 - 12:47 #3
Kig lidt på http://dk2.php.net/header

Et lille uddrag fra en kommentar, skulle kunne klare det.

$output_file = 'something.txt';
$content_len = 666;

@ob_end_clean();
@ini_set('zlib.output_compression', 'Off');
header('Pragma: public');
header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream; name="' . $output_file . '"');
header('Content-Disposition: inline; filename="' . $output_file . '"');
header("Content-length: $content_len");


$output_file = 'something.txt';
skal så blot være navnet som ligger i feltet "fil" i din tabel.
Avatar billede mahuni Nybegynder
29. juni 2004 - 13:21 #4
<?
$output_file = '/test/chat.zip';


@ob_end_clean();
@ini_set('zlib.output_compression', 'Off');
header('Pragma: public');
header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream; name="' . $output_file . '"');
header('Content-Disposition: inline; filename="' . $output_file . '"');


?>

Skal filen se sådan ud, hvis vi tager et helt simpelt eksempel, som en zip fil?

Selvfølgelig skal den så hentes i database, men er grunden rigtig?
Avatar billede Slettet bruger
29. juni 2004 - 13:25 #5
jeps det burde virke :)
Avatar billede mahuni Nybegynder
29. juni 2004 - 13:29 #6
Det virker ikke, men jeg får ikke en fejl...
Avatar billede mahuni Nybegynder
29. juni 2004 - 13:30 #7
Er det fordi jeg har noget før header?
Avatar billede Slettet bruger
29. juni 2004 - 13:35 #8
Det er det højest sandsynlig.
Du må ikke have noget output før du har sat dine headers.
Avatar billede mahuni Nybegynder
29. juni 2004 - 13:38 #9
Men, hvordan henter jeg så noget fra en database, hvis der må ikke være noget før headers?
Avatar billede Slettet bruger
29. juni 2004 - 13:40 #10
Hmm.. du må ikke lave noget der vises på skærmen før.
Du kan sagtens hente noget fra databasen og sætte filnavnet i en variabel, og derefter smide dine headers ud.
Avatar billede mahuni Nybegynder
29. juni 2004 - 13:48 #11
Det er jo også det jeg gør med den kode jeg skrev længere oppe... Men alligevel får jeg ikke den rigtige fil...
Avatar billede Slettet bruger
29. juni 2004 - 13:54 #12
må man se indholdet af din download.php ?
Avatar billede mahuni Nybegynder
29. juni 2004 - 13:59 #13
$output_file = '/test/chat.zip';


@ob_end_clean();
@ini_set('zlib.output_compression', 'Off');
header('Pragma: public');
header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream; name="' . $output_file . '"');
header('Content-Disposition: inline; filename="' . $output_file . '"');


Kun det der, så vil jeg bagefter sætte resten på, når jeg ved at det virker...
Avatar billede Slettet bruger
29. juni 2004 - 15:10 #14
Hmm... det virkede hos mig, men fandt ud af at filerne ikke kunne åbnes, fordi den ikke kendte størrelsen på filen. Så ilen man hentede var på 0 byte.

Jeg rodet lidt med det, og har lavet så det passer til din beskrivelse.
Så følgende skulle kunne klare det :)

<?PHP
// Filen der skal hentes.
$file_server_path = "chat.zip";

// Hvilket navn filen skal have når den er hentet ned.
$file_download_name = "chat.zip";

// Vi skal kende størrelsen på filen vi henter.
// Da dine filer ligger i mappen test, åbner vi den.
$dir = "/test/";

$handle=opendir($dir);
while (($file = readdir($handle))!==false) {
    if ($file == $file_server_path) {
        $download_size = filesize("".$dir."/".$file_server_path."");   
    } 
}
closedir($handle);

// Vi sætter de enkelte headers.
header("Content-type: application/x-download");
header("Content-Disposition: attachment; filename=$file_download_name;");
header("Accept-Ranges: bytes");
header("Content-Length: $download_size");

// Læser fra kilden.
@readfile("".$dir."".$file_server_path."");
?>
Avatar billede jaw Nybegynder
29. juni 2004 - 16:13 #15
Er det ikke lidt tosset, at køre alle filerne i biblioteket igennem (while-løkken) bare for at få en fils størrelse? Du har jo allerede defineret både sti og filnavn...
Avatar billede Slettet bruger
29. juni 2004 - 16:32 #16
heh jo, det var egentlig rimelig meget spild af tid.
Blot et stykke tid siden jeg sidst havde rodet med opendir og readdir, så brugte blot eksemplet fra manualen.

Men for god ordens skyld, har jeg da rettet det :)

<?PHP
// Filen der skal hentes.
$file_server_path = "chat.zip";

// Hvilket navn filen skal have når den er hentet ned.
$file_download_name = "chat.zip";

// Hvilken mappe filerne ligger i.
$dir = "test/";

// Åbner mappen.
$handle=opendir($dir);

// Finder størrelsen på filen
$download_size = filesize("".$dir."/".$file_server_path.""); 

// Lukker mappen
closedir($handle);

// Vi sætter de enkelte headers.
header("Content-type: application/x-download");
header("Content-Disposition: attachment; filename=$file_download_name;");
header("Accept-Ranges: bytes");
header("Content-Length: $download_size");

// Læser fra kilden.
@readfile("".$dir."".$file_server_path."");
?>
Avatar billede mahuni Nybegynder
29. juni 2004 - 16:52 #17
Jeg får stadig ikke mulighed for at downloade filen, nu ser det nærmere ud som om, at den udskriver filen, som tekst...
Avatar billede jaw Nybegynder
29. juni 2004 - 18:43 #18
Hvilken webserver tester du på? For har lige konkluderet, at når jeg uploader det på mit (rigtige) webhotel funker det, men når jeg bruger min egen lokale Apache-server så er det noget "biks"...
Avatar billede jaw Nybegynder
29. juni 2004 - 18:51 #19
Hov ! Der fik jeg faktisk succes ud af den her: Så prøv den lige :) (Det er næsten cypermann's)

<?PHP
$output_file = 'chat.mp3';

$download_size = filesize($output_file); 

header('Pragma: public');
header('Content-Transfer-Encoding: none');
header('Content-Type: application/octetstream; name="' . $output_file . '"');
header('Content-Disposition: attachment; filename="' . $output_file . '"');
header("Content-Length: $download_size");

@readfile($output_file);
?>
Avatar billede mahuni Nybegynder
01. juli 2004 - 12:01 #20
Jaw> Jeg kører på Linux og Freebsd, det virker ikke på nogle af dem... Men jeg prøver lige det som du skrev...
Avatar billede mahuni Nybegynder
01. juli 2004 - 12:08 #21
Warning: Cannot modify header information - headers already sent by (output started at */httpdocs/download.php:4) in */httpdocs/download.php on line 9

Warning: Cannot modify header information - headers already sent by (output started at */httpdocs/download.php:4) in */httpdocs/download.php on line 10

Warning: Cannot modify header information - headers already sent by (output started at */httpdocs/download.php:4) in */httpdocs/download.php on line 11

Warning: Cannot modify header information - headers already sent by (output started at */httpdocs/download.php:4) in */httpdocs/download.php on line 12

Warning: Cannot modify header information - headers already sent by (output started at */httpdocs/download.php:4) in */httpdocs/download.php on line 13

MZÿÿ¸@º´ Í!¸LÍ!This program cannot be run in DOS mode. $÷„”³åúS³åúS³åúSÈùöSºåúSÑúéS¿åúSÍÇæS°åúS³åûSÀåúS€ÇßSºåúSÍÇçS²åúS[úñSâäúSOÅèS²åúS0ùôSûåúS[úðS+åúS ãüS²åúSRich³åúSPELè$<à À0X÷Ð@.0ŒÈð-` ÒPIÐø.textÓ±À `.rdata.ÇÐÐÐ@@.dataØ3 À @À.tls à-`!@À.rsrc` ð-p!@@hj膽YYÃÌU‹ìƒì ‰Mà¾t«a…Àt3Àé$ƒ}ujjjj‹Màèt>…Àu3Àéj‹M Q‹Màèû‰Eüƒ}üt‹Uà¿‚q9Eüu3ÀéÖ‹Mà¿QNRj¹ðdè%߉EðÇEøƒ}ðuiÇEìÇEèj2j‹MàèU‰EôjEèPMìQ‹UôRj‹MàèÜD‰Eäƒ}

Det er det der kommer frem, når jeg bruger begge de to koder, som Jaw og Cypermann har forslået...

Andre ideer?
Avatar billede jaw Nybegynder
01. juli 2004 - 13:54 #22
Har du et html-output først? Eller nogen <mellemrum> før du starter din ?>    ?
Avatar billede mahuni Nybegynder
01. juli 2004 - 13:59 #23
Min kode, ser ud som den kode du skrev længere oppe... Det undrer mig meget.
Avatar billede jaw Nybegynder
01. juli 2004 - 14:06 #24
Hmmm, og 100% du ikke har et mellemrum/linieskift eller noget før <?PHP    ?

Du kan også se den kode jeg skrev her: http://syndicate.dk/exp/dl.php
Avatar billede mahuni Nybegynder
01. juli 2004 - 14:15 #25
Det virker, men det fil jeg får, kommer til at hedde download og ikke chat.zip, det er en lille fejl, men ved du hvorfor?
Avatar billede jaw Nybegynder
01. juli 2004 - 14:17 #26
hmm, nah det ved jeg nu ikke lige... det virker fint her... :/

Var det hos dig det faktisk virkede nu?
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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