2012-02-28 11 views
1

さまざまな有料プログラムをダウンロードするためにログインする必要があるphpとmysqlを使用してページを設定しました。ここでリンクをクリックすると、プログラムが正しくダウンロードされて実行されます。PHPでexeファイルをダウンロードする際のWindowsの互換性エラー

$c3 = mysql_result($result,$i,"exe"); 
echo "<a href='$c3'>... etc 

しかし、プロパティをRT-クリック彼らは、そのファイルへのパスを見ることができますので、私はに上記の変更:

次のようにdownloads3.phpがある
$c3="downloads3.php?link=".mysql_result($result,$i,"exe"); 

<?php 
$file = $_GET['link']; 
$size = filesize($file); 
$type = filetype($file); 
$path = "../downloads/"; 
header('Content-Type: $type'); 
header("Content-Transfer-Encoding: Binary"); 
header("Content-Disposition: attachment; filename=$path.$file"); 
header("Content-Length: ".filesize($file)); 
readfile($file_url);?> 
?> 

正しいファイルが見つかりましたが、セキュリティ上の警告が表示されますが、クリックするとすぐに、このバージョンのWindowsと互換性がないというWindowsエラーメッセージが表示されます。上記のヘッダーにあるものである必要がありますが、何が分かりません。さまざまな順列を試みた。

上記の作業をするか、またはソースパスを隠す他の方法のいずれかを使用していますか?ありがとう。

+0

2つの質問がありますが、ここでは$タイプが定義されていますが、これはすべてのバージョンのWindowsで起こっていますか、特定のバージョンのみですか?私はあなたがプログラムが本当に直接使用されるときに互換性があることを確かめたと仮定していますか? – AlexC

+0

ダウンロードしたファイルと元のファイルを比較するとどうなりますか?それぞれの16進ダンプを保存し、diffを使用して比較を行います。 EXEファイルが壊れているように見えます。 EXEファイルが大きければ、ダウンロードが完了する前にスクリプトが強制終了されるかもしれません。また、16進ダンプのdiffを使用すると、何が起こっているのかが強調されます。 –

答えて

1

予期しない出力によってEXEが壊れている可能性は非常に高いです。あなたのdownloads3.phpファイルは、ダウンロードに表示されますいくつかの余分な出力を持っています

readfile($file_url);?> //PHP stops parsing here 
?> //output "\n?>" 

PEヘッダー自体は、それが上で実行することができますので、ファイルが送信される前にエラーが発生した場合は、彼らが表示されますどのバージョンのWindowsに指示しますWindowsがヘッダーを期待している場所で。

これを軽減するには、ファイルの末尾に余分な改行と?>を削除して、ファイルの先頭にあるerror_reporting(0)でエラー報告をオフにすることができます。

+0

すべての答えをありがとう。 $ type = filetype($ file)上記の "file"を返します – user1164035

1

たいあなたが持っているものを任意の名前でダウンロードファイルを取得するここでのベストソリューション

function force_download($filename = '', $data = '') 
{ 
    if ($filename == '' OR $data == '') 
    { 
     return FALSE; 
    } 

    // Try to determine if the filename includes a file extension. 
    // We need it in order to set the MIME type 
    if (FALSE === strpos($filename, '.')) 
    { 
     return FALSE; 
    } 

    // Grab the file extension 
    $x = explode('.', $filename); 
    $extension = end($x); 

    // Load the mime types 
    if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes'.EXT)) 
    { 
     include(APPPATH.'config/'.ENVIRONMENT.'/mimes'.EXT); 
    } 
    elseif (is_file(APPPATH.'config/mimes'.EXT)) 
    { 
     include(APPPATH.'config/mimes'.EXT); 
    } 

    // Set a default mime if we can't find it 
    if (! isset($mimes[$extension])) 
    { 
     $mime = 'application/octet-stream'; 
    } 
    else 
    { 
     $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension]; 
    } 

    // Generate the server headers 
    if (strpos($_SERVER['HTTP_USER_AGENT'], "MSIE") !== FALSE) 
    { 
     header('Content-Type: "'.$mime.'"'); 
     header('Content-Disposition: attachment; filename="'.$filename.'"'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header("Content-Transfer-Encoding: binary"); 
     header('Pragma: public'); 
     header("Content-Length: ".strlen($data)); 
    } 
    else 
    { 
     header('Content-Type: "'.$mime.'"'); 
     header('Content-Disposition: attachment; filename="'.$filename.'"'); 
     header("Content-Transfer-Encoding: binary"); 
     header('Expires: 0'); 
     header('Pragma: no-cache'); 
     header("Content-Length: ".strlen($data)); 
    } 

    exit($data); 
} 

$data = 'Here is some text!'; 
$name = 'mytext.txt'; 

force_download($name, $data); 
+0

すべての答えに非常に感謝します。上記の$ type = filetype($ file)は、 "file"を返します。 "exe"で試してみましたが、違いはありません。このプログラムはWindowsのすべてのバージョンで動作し、このコードではなく、直接ダウンロードして正常に動作します。それが何であれダウンロードしているのは私のファイルではなく、とにかく完全なものではありません。私が「別名で保存」を行うと、ダウンロードはほぼ即座に完了し、ファイルはわずか1kbです。それはホスト上で35Mbです。また、間違ったものを削除しましたか?まだSamadのコードを試したことはありませんが、私はそうします。 – user1164035

0

DOH !!!!!!!!!!!!!!!!あまりにも多くのカットと貼り付け、そのコードは本当に愚かなエラーを持っていますreadfile($ file_url)はreadfile($ file)でなければなりません。

すべてのコメントありがとうございます、あなたの時間を無駄にして謝罪します。

+0

Erm。しかし、プログラムのパスを隠すことは、 "実行または保存しますか?"というメッセージにはあまり意味がありません。ホーハム。 – user1164035

関連する問題