2011-07-21 22 views
0

私はユーザーがサーバーに文書をアップロードできるようにしています。しかし、私は、ファイルがどこに格納されているかを明らかにしたくない。私は何をすることができますが、まだファイルを取得することができますが、ファイルの場所を見ることなく。ファイルの場所が表示されないようにするにはどうすればよいですか?

+1

なぜ彼らはファイルが格納されている場所を確認しますか? – Mike

+0

ドキュメントを提供するにはダウンロードするリンクがあるでしょうか? – KPO

+0

アップロード(サーバーにファイルを送信しているクライアント)またはダウンロード(サーバーからファイルを取得しているクライアント)について話していますか? – Mike

答えて

3

あなたはこれを達成するためにPHPのクエリを使用することができ、あなたは、次のURLを使用して言うことができます:files.phpで

http://mysite.com/files.php?file=xyz.pdf 

あなたが得る変数ファイルをチェックして、ファイルを取得し、ハードコーディングされた機能を持たせることができます。ヘッダーを使ってダウンロードを強制するか、ファイルをvarに読み込んで内容をページに出力することで、これを行うことができます。たとえば、pdfファイルを読み込んでページに印刷するのと同じことは、ファイルにリンクすることと同じです。

警告:ヘッダーを使用すると、ファイル以外のページには何も印刷されません。また、ファイルを読み込んで印刷しても、エンドユーザがファイルのソースであるgobbly goop(jpgまたはpdf)を取得しないようにするには、ヘッダーを削除することをお勧めします。

ああ、私はヘッダーの警告を忘れていました.AdobeがPDFを作成したアプリケーションとユーザーがアップロードしているブラウザに応じて、PDFのオープンソースのISOを作成して以来、 PDFは、ヘッダから何もすることになります。一生懸命ヘッダタイプにアップロードセクションをコーディングするように注意してください

'application/pdf', 'application/x-download','application/octet-stream','application/octet','binary/octet-stream' 

、私はこの質問がダウンロードについてです知っているが、私はちょうど私がそこにそれを投げるだろうと思いました。ダウンロードのためのヘッダーを使用することも重要ではありません。私は単純に標準アプリケーション/ pdfを使用します。

+0

+1タイピングのスピードだけではありません。それは良い答えを提供することです。 – Mike

+0

ありがとうございます。実際にidを持っているといいのではないでしょうか?一度人がpage.phpに行くとid = idjfkldjポップアップが開いて保存するように要求されますか? – KPO

+1

@KPOはいですが、DBを作成してIDとファイル名をテーブルに格納する必要があります。それはちょっとだけ作業とセキュリティを少し追加します。それはあなた次第です。 – BrandonS

1

実際のファイルにマップできるランダムな一意のIDを使用して格納し、実際のファイルでreadfile()のスクリプトを使用して配信します。

http://php.net/readfile文書には強制的にダウンロードする方法の例もあります。

+0

本当ですか?同じ回答と私の秒以内に掲載されていますが、すでに投票がありますか?ああ、私はそこに良い仕事を推測速く入力する必要があります。 – BrandonS

+0

私は速いものに入ることを試みていませんでした。私は、彼がさらに調査し、うまくいく計画を見つけるのに十分な情報だと思ったものを投稿しました。 –

+0

オハイオ州の男私はちょうど私のために悪い幸運を言っていた、実際にそれはすべて私が動揺しなかったか冗談のようにすべてだった。 – BrandonS

2

この藤堂いくつかの方法がありますが、私のようなユーザー名またはパスワードを使用することができだから私のリンクは、URL内のhttp://example.com/files/filename.zip 余分なパラメータのようになります

を.htaccessを使用して好む:

http://example.com/files/bob/filename.zip 

http://example.com/files/18d52c/filename.zip 

をその後、データベースと照合して、支払い後に即座にダウンロードするのと同じように、ユーザーがその特定のファイルをダウンロードできるかどうかを確認できます。

の.htaccess

RewriteRule ^files/(.*)$ serve.php?file=$1 

serve.php

<?php 
if(isset($_GET['file'])){ 
    $file=basename($_GET['file']); 
    //Protect the index.php && serve.php 
    if(basename($_GET['file'])=='index.php' || basename($_GET['file'])=='serve.php'){ 
     header("HTTP/1.1 403 Forbidden");die(); 
    } 
    $downloadFolder="original_location/"; 
    if(file_exists($downloadFolder.$file)){ 

     $fsize = filesize($downloadFolder.$file); 
     $ctype=finfo_file(finfo_open(FILEINFO_MIME_TYPE), $downloadFolder.$file); 

     if(ini_get('zlib.output_compression')) 
     ini_set('zlib.output_compression', 'Off'); 

     header("Pragma: public"); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: private",false); 
     if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) { 
      header("Content-Type: application/force-download"); 
      header('Content-Description: File Transfer'); 
     }else{ 
      header("Content-Type: $ctype"); 
     } 
     header("Content-Disposition: attachment; filename=\"".basename($file)."\";"); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-Length: ".$fsize); 

     ob_clean(); 
     flush(); 
     readfile('original_location/'.$file); 
    }else{ 
     header("HTTP/1.0 404 Not Found"); 
    } 
    die(); 
} 
header("HTTP/1.0 404 Not Found"); 
?> 

original_location/index.phpを

header("HTTP/1.1 403 Forbidden"); 
+0

あなたはmimeタイプのビジネス全体をhttp://www.php.net/manual/en/ref.fileinfo.phpに置き換えることができます... –

+0

ありがとうございました。あなたの提案を追加しました。 –

+0

ローレンスの+1美しい実装、それはすべての基本とエラーのシナリオをカバーします。私は今私の答えを恥じています。私は基本的に彼に同じことを話しましたが、あなたのコードはすべての基盤をカバーしています。もし気にしないなら、私のスニペットライブラリに追加したいと思います。 。 – BrandonS

関連する問題