[ twister @ 17.02.2006. 19:18 ] @
Nadam se da nisam promasio forum.

Posetioci sajta treba da budu u mogucnosti da download-uju softver kada unesu username i pass (cita se iz baze). Naravno, link ne sme da se vidi. Pomislio sam da bi najbolji nacin bio da nakon unosa usr/pwd forsiram download koristeci header. I to radi.

Ali SAMO NA BRZIM VEZAMA. Kad neko pokusa sa telefonske linije (digitalne, bez obzira na provajdera) prenos fajla puca - klijenti kazu najcesce na oko 70% a kada sam ja testirao, pucao je na 16%, sto je verovatno nebitno.

Pomislio sam da je mozda do max_execution_time u php.ini-i s obzirom da idem preko hedaer-a. Dodao sam set_time_limit(10000) (bilo je na 1000)
I dalje puca.

Sajt je radjen u PHP-u i MySQL-u. Provajder je Loopia. Fajl je velicine 3.5MB.

Hvala unapred.

[ SmilieBG @ 17.02.2006. 20:50 ] @
Uh :S Tu moze da bude mali milion stvari koje uticu na to :(

I ja sam radio skriptu za download, gde sam takodje sam fajl preko header-a slao i to lepo radi (stim sto su veci fajlovi, od 16 do 80 MB), pa cak i na sporijim vezama...

Kako saljes sam fajl korisniku? Preko headera ili...? Daj taj deo koda.

Poz,
Sale
[ twister @ 18.02.2006. 20:36 ] @
Evo koda, ali mislim da je lakse da ti posaljes svoj, premda radi :)
u sustini sam radio c&p koda sa neta, samo sam iskoristio u svojoj funkciji

function dl_file($file){
if (!is_file($file)) { die("<b>404 File not found!</b>"); }

//Gather relevent info about file
$len = filesize($file);
$filename = basename($file);
$file_extension = strtolower(substr(strrchr($filename,"."),1));

//This will set the Content-Type to the appropriate setting for the file
switch( $file_extension ) {
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
case "mp3": $ctype="audio/mpeg"; break;
case "wav": $ctype="audio/x-wav"; break;
case "mpeg":
case "mpg":
case "mpe": $ctype="video/mpeg"; break;
case "mov": $ctype="video/quicktime"; break;
case "avi": $ctype="video/x-msvideo"; break;

//The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
case "php":
case "htm":
case "html":
case "txt": die("<b>Cannot be used for ". $file_extension ." files!</b>"); break;

default: $ctype="application/force-download";
}

//Begin writing headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");

//Use the switch-generated Content-Type
header("Content-Type: $ctype");

//Force the download
$header="Content-Disposition: attachment; filename=".$filename.";";
header($header );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$len);
//header("Location: http://www.sbb.co.yu");
@readfile($file);
exit;
}
[ SmilieBG @ 18.02.2006. 21:14 ] @
Cao,

Ovako, pazi se sa @readfile() posto mu je cud takva, da prvo ucita ceo fajl u RAM pa tek onda da ga salje... Ako imas puno ljudi koji skidaju, ode RAM, posle njega pada CPU i onda ode sve...

Sto se tice downloada, ja sam to ovako resio (posto je meni readfile ubija server):

Code:

$downloaddir = "/root/music/download/sm/";
$downloadURL = "http://download.mojdomen.com/sm/";

$letters = 'abcdefghijklmnopqrstuvwxyz';
srand((double) microtime() * 1000000);

$string = '';
for ($i = 1; $i <= rand(4,12); $i++) 
{
   $q = rand(1,26);
   $string = $string . $letters[$q];
}

mkdir($downloaddir . $string, 0777);
$target = $_GET['file'];
$new_file = substr(strrchr($file, '/'), 0);
symlink($target, $downloaddir . $string . $new_file);

Header("Location: " . $downloadURL . $string . $new_file);


Ovo sam 'morao' ovako da resim, posto mi je readfile ubijao server. Drugi nacin, koji je za mene mogao da prodje jeste da 'seckam' fajl koji saljem, pa malo po malo da ga saljem, ali mi je ovo bilo daleko jednostavnije... Naravno, dedicated server, pa imam sve privilegije, sto u tvom slucaju moze da bude prepreka, ali ti daje ideju kako sam to resio ;)

Poz,
Sale
[ twister @ 19.02.2006. 17:04 ] @
Problem je u tome sto je server na windows-u, tako da symlink ne mogu da loristim. Izvinjavam se, zaboravio sam to da napisem.
Kada postavim location u header, IE download-uje fajl, a CrazyBrowser pocne da otvara djubre. Ima li resenja, tako da svaki browser pocne download?

--- pomalo off-topic:
Nisam korisnik *nix sistema, ne znam da li symlink traje samo tokom jedne konekcije (HTTP/1.1) ili kako se vec to gleda? Posto kreiranje foldera i pravljanje symlinkova (u slucaju neautomatskog brisanja) verovatno "ubilo" prostor na hardu.
[ obucina @ 19.02.2006. 18:25 ] @
Jedan primer koji sam nedavno pisao za www.phpbee.com:

Code:

if (isset($_POST["username"]) && ($_POST["username"] == "phpbee") && 
    isset($_POST["password"]) && ($_POST["password"] == "phpbee"))
  SendFile();
else
  DisplayLoginPage();

function DisplayLoginPage()
{
?>
<html>
  <head>
    <title>Protected download</title>
  </head>
  <body>
    <h2>Welcome to download area</h2>
    <p> Type username and password to download a file </p>
    <p> Type phpbee for both username and password </p>
    <form action="download.php" method="post">
      Username<br>
      <input type="text" name="username"><br>
      Password<br>
      <input type="password" name="password"><br>
      <input type="hidden" name="login"><br>
      <input type="submit">
      <input type="reset">
    </form>
  </body>
</html>
<?php
}

function SendFile()
{
  $FileName = "filename.zip";
  //header("Content-Type: " . mime_content_type($FileName));
  // if you are not allowed to use mime_content_type, then hardcode MIME type
  // use application/octet-stream for any binary file
  // use application/x-executable-file for executables
  // use application/x-zip-compressed for zip files
  header("Content-Type: application/octet-stream");
  header("Content-Length: " . filesize($FileName));
  header("Content-Disposition: attachment; filename=\"$FileName\"");
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  $fp = fopen($FileName,"rb");
  fpassthru($fp);
  fclose($fp);
}

[ SmilieBG @ 19.02.2006. 21:27 ] @
pogledaj i http://php3.de/fpassthru

ja cu od nedelje da preradim moju skriptu, sa ciljem da:

1. moze da se nastavi download u slucaju pucanja veze;
2. da vrati info ukoliko je download uspesan.

Poz,
Sale
[ Nemanja Avramović @ 19.02.2006. 21:59 ] @
...i okachi je ovde
[ SmilieBG @ 19.02.2006. 23:12 ] @
stavicu je negde na netu, bice dostupna ;)

Poz,
Sale
[ Nemanja Avramović @ 20.02.2006. 09:03 ] @
Hvala unapred!