2012-09-27 76 views
3

我試圖做一個簡單的腳本,做了兩兩件事:通過readfile()保護/提供文件,強制下載?

  1. 供應了一個文件,並隱藏的是目的地
  2. 擁有下載計數器

現在,我這樣做在wordpress環境中,但這個問題並不完全與wordpress相關,所以我想我會在這裏問。

基本上,我現在設置的方式是,我有一個鏈接,當你點擊它時,設置一個$_['GET'],然後檢查是否設置。如果已設置,則會提供下載文件。

鏈接:<a href="http://localhost:8888/fresh/?dl_id=01">Click here!</a>

$_['GET']代碼:http://pastebin.com/93nD43gA

有一個位代碼WordPress的行話,但基本上它是檢查的下載次數user_meta,如果它是> 0,serveFile()被稱爲。

我在這裏遇到的主要問題是,如果我點擊鏈接,readfile()將實際文件內容載入窗口(亂碼文本)。如果我將target=_blank添加到<a>它將打開一個新的瀏覽器窗口並將內容加載到窗口中。

這種方法在我作爲獨立的php文件進行時似乎工作得很好。我的主要問題是我需要保留wordpress空間,以便可以調用與之相關的函數等。

我已經從自我頁面上使用$_['GET']嘗試,具有自定義模板(在上面的引擎收錄的代碼)另一頁,並作爲一個獨立的PHP文件。前兩個選項都將文件加載到窗口中。第三個不保留WordPress的功能,即使我包括blog-header.php

任何人都可以指向我如何讓文件強制下載並不加載INTO窗口的正確方向?

回答

3

無論文件類型是什麼,您都需要設置適當的標頭。例如,如果readfile總是供應,PDF文件,它應該做這樣的:

// disable browser caching -- the server may be doing this on its own 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 

header('Content-Type: application/pdf'); 
//forces a download 
header("Content-Type: application/force-download"); 
header('Content-Disposition: attachment; filename=filename.pdf'); 
readfile($file); 

記住,如果你還沒有要求在所有包括空格發送的任何數據header纔有效。

+0

感謝您的快速回復。我想知道這是否是問題。我會看看並報告。 – tr3online

+0

我現在正在服務一個rar。它與八位字節流(也嘗試x-rar壓縮)工作正常與獨立的php文件。但是,如果我嘗試在Wordpress中做同樣的事情,它會輸出到網站的正文中。我無法鏈接到Wordpress中的另一個頁面,同一頁面或獨立的php文件,並獲取該文件以強制執行dl。我閱讀也許設置一些.htaccess的東西可能會有所幫助。我很茫然。 – tr3online

+0

@ tr3online查看帶有'readfile'註釋的頁面輸出。有沒有輸出?也看看發送的標題。 –

-2

「亂碼」文本是你想要的,但除此之外,你必須設置一個MIME。這可以通過簡單地設置標題來完成,例如, header("Content-Type: image/png");

如果文件默劇會有所不同(例如PDF,DOC,PNG等),你應該看看FINFO擴展。有了它,你可以得到的文件

<?php 
$finfo = new \finfo(FILEINFO_MIME); 
$mime = $finfo->file('path/to/file', FILEINFO_MIME_TYPE); 
header("Content-Type: $mime"); 

如前所述的充分和正確的MIME - 如果不輸出寫入已經做到頭只能設置(無回聲的,打印等Output buffering可以幫助你在這裏) 。