Indirmek için harici bir sunucuya bir dosyadan Başlıkları itmek nasıl?

1 Cevap php

Aşağıdaki komut dosyası, kullanıcıların bir dosyayı indirmek için iletişim kutusu görünür böylece ben genellikle tarayıcı başlıklarını itmek için kullanmak budur.

Ancak, bu durumda dosya farklı bir sunucuda bulunur. Bu fark yapmak gerekir ama o bana veriyor ben bir externam MP3 dosyasının URL ile bu script çalıştırdığınızda olarak yok ama ben "HATA: Dosya bulunamadı". Ancak, bu dosya var, ve ben bu script geçmek aynı URL'yi kullanarak kendisine alabilirsiniz.

Herhangi bir fikir neden? Ben herhangi bir yardım takdir ediyorum.

<?php session_start();

//below variable contains full path to external site where file resides
$filename = $_SESSION['$serverURL'].'audio/'.$_SESSION['fileName'].'.mp3';
//below variable contains a chosen filename of the file to be downloaded
$properFilename = $_GET['properFilename'].'.mp3';

// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');

// addition by Jorg Weske
$file_extension = strtolower(substr(strrchr($filename,"."),1));

if( $filename == "" ) 
{
  //echo "download file NOT SPECIFIED";
  exit;
} elseif ( ! file_exists( $filename ) ) 
{
  //echo "ERROR: File not found";
  exit;
};
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;
  default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers 
header("Content-Type: $ctype");
// change, added quotes to allow spaces in filenames, by Rajkumar Singh
header("Content-Disposition: attachment; filename=\"".basename($properFilename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
exit();   

?>

1 Cevap

Tek tırnak dizeleri değişkenler için ayrıştırıldı değil, bu yüzden $_SESSION['$serverURL'] muhtemelen beklediğiniz gibi işe gitmiyor. Sana $_SESSION[$serverURL] veya $_SESSION['serverURL'] Yani sanıyorum.

Ayrıca filesize() çağırıyor ve ardından readfile() (muhtemelen bu şekilde önbelleğe alır sürece) iki HTTP istekleri diğer sunucudan dosya almak için yapım komut neden olur. Sen daha iyi bir seçenek olabilir ki, cURL kullanarak bir HTTP isteğinde bunu yapabilirdi. Burada kısa bir örnek, ne istediğinizi yapmak için uyum gerekir. Ayrıca yerine onlara kendinizi yeniden-üreten daha güvenilir (varsa) gibi diğer sunucudan Content-Type başlığı gibi diğer başlıkları yönlendirme düşünebilirsiniz.

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://example.com');

//set callbacks to receive headers and content
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'on_receive_header');
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'on_receive_content');

//send your other custom headers somewhere like here

if (false === curl_exec($ch)) {
    //handle error better than this.
    die(curl_error($ch));   
}

function on_receive_header($ch, $string) {
    //You could here forward the other headers received from your other server if you wanted

    //for now we only want Content-Length
    if (stripos($string, 'Content-Length') !== false) {
        header($string);   
    }

    //curl requires you to return the amount of data received
    $length = strlen($string);
    return $length;
}

function on_receive_content($ch, $string) {
    echo $string;

    //again return amount written
    $length = strlen($string);
    return $length;
}