2012-09-25 17 views
8

मैं मेरे hotlinkers से फ़ाइल की रक्षा के लिए के लिए एक अस्थायी डाउनलोड लिंक के लिए एक परियोजना बना रही हूँ के लिए अस्थायी लिंक बनाने के लिए ...एक डाउनलोड करने योग्य फ़ाइल

मेरा मानना ​​है कि .. कि यह ऐसा करना संभव है, क्योंकि हम सभी जानते हैं कि फ़ाइल साझा करने वाली कई साइटें "किसी भी" का उल्लेख नहीं करना चाहती हैं ... फ़ाइल के लिए उनके लिंक की समाप्ति है ...

पूर्व।

यदि मैं अपनी साइट से एक फ़ाइल डाउनलोड करता हूं तो वे इसे क्लिक करने के लिए एक सीधा लिंक देते हैं? लेकिन फिर वह लिंक कुछ घंटों या मिनटों के बाद समाप्त हो जाएगा।

मुझे कैसे पता होना चाहिए कि लिंक समाप्त हो गया था? अगर मैं एक दिन के बाद अपने डाउनलोड मैनेजर पर एक ही लिंक कॉपी करता हूं, तो यह एक ही फाइल डाउनलोड नहीं कर सकता है।

मैंने इसे पहले से ही htaccess में संभव बना दिया है।

पूर्व।

RewriteRule .*\.(rar|ZIP)$ http://domain.com [R,NC] 

वे http://domain.com

में ब्राउज़र वे पुनः निर्देशित किया जाएगा के एड्रेस बार में सीधा लिंक कॉपी करता है, तो लेकिन फिर अगर वे अपने डाउनलोड प्रबंधक पर सीधा लिंक कॉपी फ़ाइल डाउनलोड किया जाएगा।

क्या वे मंच वेबसाइट, ब्लॉग, आदि, की तरह किसी भी अन्य साइट में लिंक पोस्ट और इतना है कि वे इसे सीधे डाउनलोड कर सकते हैं, उनके डाउनलोड प्रबंधक में उसे कॉपी करके पेस्ट करने के लिए पाठक से पूछें कि।

यह समस्या है जिसे मैं अपनी फ़ाइल की सुरक्षा के लिए रोकना चाहता हूं। मैं इसे PHP पर कर रहा हूं लेकिन मैं इसे समझ नहीं सकता ...

आपकी सहायता बहुत सराहना की है।

उत्तर

1

उपयोग इस

$path="uploads/"; 
        $actualfilename=$path.$filename; 
        $fakefilename="downloadfile.pdf"; 
        if($typeofview=="download") { 
          @readfile($actualfilename); 
         header('Content-type: application/pdf'); 
         header('Content-Disposition: attachment; filename="' . $fakefilename . '"'); 
         header('Content-Transfer-Encoding: binary'); 
         header('Content-Length: ' . filesize($actualfilename)); 
         header('Accept-Ranges: bytes'); 
         exit; 

जैसे कुछ कोड अपने में जोड़ना।htaccess फ़ाइल

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule fakefile.php(.*)$ orignalfile.php?$1 [L,QSA] 
+0

इस कोशिश करेंगे एक बहुत बहुत धन्यवाद। – Vhanjan

+0

आपको इसके लिए .htaccess का उपयोग नहीं करना चाहिए क्योंकि यह अधिक असंभव हो जाएगा क्योंकि आपके पास और अधिक फ़ाइलें और अलग-अलग स्थान हैं। – dogmatic69

0

समाधान है कि मेरे दिमाग में आता है के रूप में इस प्रकार है: यदि आप तालिका जो फ़ाइल का प्रतिनिधित्व करते है, तो और उदाहरण FileModel आप फ़ाइल, कुछ विवरण, आकार की वहाँ नाम को बचा सकता है, यह भी करने के लिए पथ के लिए अपने फाइल सिस्टम और अद्वितीय में फ़ाइल, आप उदाहरण के लिए कुछ फ़ाइल विवरण के आधार पर इसके लिए चुनें डेटा में से कुछ से md5 का नतीजा हो सकता है जो:

$data[FileModel]['unique'] = md5(time() . $data[FileModel]['file']); 

हर बार दे कोई सहायता से आप अपने फाइल डाउनलोड अगर वहाँ से पहले आपकी तालिका में ऐसा अनूठा मूल्य यदि आप किसी को इसे डाउनलोड करने के साथ डाउनलोड करते हैं फ़ाइल फ़ाइल में बनाई गई फ़ाइल विधि, लेकिन बस से पहले कि आप यदि वहाँ उर डेटाबेस में ऐसी कोई अनूठा मूल्य तो आप उपयोगकर्ता

$this -> setFlashError('link expired'); 

को timeouted लिंक के बारे में त्रुटि दिखाने नई किसी भी अधिक डाउनलोड

$data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']); 
$this -> FileModel-> save($data[$this -> name]); 
$this -> FileModel -> downloadFile($data[$this -> name]); 

से रोकने के लिए अद्वितीय बनाने यहाँ मैं आप के लिए Pase कार्रवाई का एक उदाहरण प्रोटोटाइप जो आप अपने नियंत्रक में के साथ शुरू कर सकते हैं:

function download($file_data = ''){ 
     $data = $this->FileModel->find('first', array('conditions' => array('FileModel.unique' => $file), 'fields' => array('*'))); 

     if(!is_array($data[FileModel])) $this -> setFlashError('link expired'); 

     else 
     { 
      $data[FileModel]['unique'] = md5(time() . $data[$this -> name]['file']); 
      $this -> FileModel-> save($data[$this -> name]); 
      if(!$this -> FileModel -> downloadFile($data[$this -> name])) 
      { 
       $this -> setFlashError('error')); 
      } 
     } 
} 
इसके अलावा, आप datetime क्षेत्र है जहाँ आप उदाहरण के लिए वर्तमान Dat के लिए 1 दिन में जोड़ सकते हैं बना सकते हैं

ई और इसे समाप्त करने के लिए बाउटर का समय बचाएं।

21

/downloads/abb76b3acbd954a05bea357144d614b4 जैसे कुछ से लिंक करें, जहां abb ... एक यादृच्छिक स्ट्रिंग है जैसे वर्तमान समय के नमकीन हैश। जब आप किसी के लिए यह लिंक बनाते हैं, तो डेटाबेस तालिका में यादृच्छिक स्ट्रिंग को स्टोर करें।

+----+-------------+----------------------------------+---------------------+---------------------+ 
| id | filename | token       | created    | modified   | 
+----+-------------+----------------------------------+---------------------+---------------------+ 
| 1 | image.jpg | abb76b3acbd954a05bea357144d614b4 | 2012-03-26 19:36:41 | 2012-03-26 19:36:41 | 
| 2 | program.exe | 19660d0f5e0ca3d42e1718de5d0a1d7e | 2012-08-29 11:07:58 | 2012-08-29 11:07:58 | 
+----+-------------+----------------------------------+---------------------+---------------------+ 

जब आप /downloads/... पर एक अनुरोध मिलता है, यादृच्छिक स्ट्रिंग को देखने और सही फ़ाइल वापस भेज: यह तालिका की तरह लग रहे हो सकता है। यदि created टाइमस्टैम्प बहुत पुराना है, तो ऐसा न करें। पुराने टेबल पंक्तियों को कम करने के लिए क्रोनबॉज का प्रयोग करें, या कम आदर्श, हर बार जब कोई /downloads/... पर अनुरोध करता है तो ऐसा करें।

+0

मुझे लगता है कि यह आसान और साफ है लेकिन फिर भी संभावना है कि कोई फ़ाइल डाउनलोड करेगा। –

0

एक मैं पाया है:

header('Content-Type: application/force-download'); 
$filee = "your_file.txt"; 
$filesLocation = dirname(__file__).'/the_sub_folder_for_the_file/'.$filee; 
header('Content-Length:' . filesize($filesLocation)); 
header("Content-Disposition: inline; filename=\"".$filee."\""); 
$filesPointer = fopen($filesLocation,"rb"); 
fpassthru($filesPointer); 
0

मैं इस पुराने सवाल पता, लेकिन मैं बिना उपयोग डेटाबेस फ़ाइल डाउनलोड करने के लिए सिर्फ 1 बार रास्ता नहीं है, तेजी से रास्ता :)

if(isset($_GET['file']) && file_exists($_GET['file'])) 
{ 
    $oldName = $_GET['file']; 
    $newName = md5(time()).".txt"; 

    if(rename($oldName, $newName)) { // rename file to download just once 
     downloadFile($newName); // download file function 
    } else { 
     echo 'this file is not exist'; 
    } 
} 
संबंधित मुद्दे