2016-05-12 8 views
-1

次のスクリプトを使用して写真をダウンロードしていますが、もう機能しなくなりました。 is_fileの機能では、画像が存在する実際の画像の場所にファイルではないように、リダイレクトされます。私がそれを取ると、ダウンロードされますが、jpgにエラーがあります。イメージがそこにあるので確信していません(ダウンロードがなければあなたはそれにリダイレクトされます)。php forceダウンロードスクリプトはもう動作しません

<?php 

    ini_set('memory_limit', '-1'); 

    $sourceFile = $_GET['file']; 

    $sourceFile = urldecode($sourceFile); 


    if(headers_sent()) 
    die('Headers Sent'); 

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

    if (!is_file($sourceFile)) 
    header('Location:'. $sourceFile) ; 

    $len = filesize($sourceFile); 
    $filename = basename($sourceFile); 
    $file_extension = strtolower(substr(strrchr($filename,"."),1)); 

    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 ".docx": $ctype="application/vnd.openxmlformats-officedocument.wordprocessingml.document"; break; 
    case ".pptx": $ctype="application/vnd.openxmlformats-officedocument.presentationml.presentation"; break; 
    case ".xlsx": $ctype="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 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; 
    case "mp4" : $ctype="video/mpeg"; break; 

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

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

    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"); 
    header("Content-Type: $ctype"); 
    $header="Content-Disposition: attachment; filename=".$filename.";"; 
    header($header); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: ".$len); 
    echo file_get_contents($sourceFile); 
    exit; 

答えて

1

is_file()が失敗する可能性があります多くのものがあります。

  1. それは動作を停止したときに、それが働いたとするときの間で変化し、ご使用の環境はどう?親ディレクトリを含むファイルのアクセス許可を確認してください。
  2. 特定の画像では動作しますか?あなたのファイルサイズが整数ストレージよりも大きいかもしれません。

    注:manualからPHPの整数型が署名され、多くのプラットフォームは、32ビットの整数を使用しているため、いくつかのファイルシステム関数は、2GBを超えるいるファイルに対して予期しない結果を返すことがあります。

  3. ファイル名には任意の外来文字が含まれていますか?削除してください。
  4. 相対パス/images/file.jpgの代わりに完全絶対パス/var/www/html/images/file.jpgを使用してみましたか?
  5. file_exists()のような代替機能を試しましたか?

2番目の問題が発生すると、.jpgにファイルチェックを行わなくてもエラーが発生します。

  1. エラーは正確に何か、または破損したファイルをダウンロードするという意味ですか?

&私のローカルテスト環境にコードを貼り付けても、エラーなしで正常に動作するようです。上記の情報が役に立たない場合は、質問を詳細に更新してください。

+0

1.)Wordpressは何をしているのですか?ファイルの権限は変更されていません。2.)それ以上のファイルサイズは1.1 MBに似ています。 3.)外来文字は使用せず、urldecode()を使用してください。4.)私が使用するパスはhttp://example.com/wp-content/02/theimage.jpgに似ています.Jpegに関しては、 "The file" Ec_4K5A0220と言います。 jpg "が空であるため開けませんでした。 – Packy

+0

@Packyあなたは画像の1つを提供できますか?私が言ったように、コードに間違いがないように見える。だから、それはサーバー設定のものか画像そのもののどちらかです。 –

+0

私は何を考えていたのですか?画像をダウンロードするには、古いファッションのリンクをクリックし、右クリックしてダウンロードするだけです。 – Packy

関連する問題