2012-02-19 4 views
1

私が実装しようとしているのは、PHPを通してファイルをダウンロードすることです。 私が直面している2つの問題があります。私は頭がおかしくなって、ここで間違っていることを考えています。PHPはファイルのダウンロードを強制します - ダウンロードが途切れているか、システムが無効であるか壊れていると言うファイル

  1. 私がダウンロードした」と言うIEのエラーメッセージを取得すると、ダウンロードが停止したときに、私はIEを使用してファイルをダウンロードしようとするたびに、ダウンロードがについての私のファイルサイズは1024KBであると言うつまり途中で中断され、500KB程度であります中断された '
  2. 頻繁に遭遇する他の問題は、ダウンロードしたファイル(実際にはzipファイル)が何らかの理由で時々破損するということです。サーバー上のファイルは問題ありません。もしそこから直接ダウンロードすれば問題はありません。しかし、PHPスクリプトを使用してダウンロードしてファイルを解凍しようとすると、Windowsに「無効なファイルまたは破損したファイル...」というメッセージが表示されます。

本当に助けが必要です。続き

は、ファイルをダウンロードするコードのブロックである: -

$fileName = "./SomeDir/Somefile.zip"; 
$fsize = filesize($fileName); 
set_time_limit(0); 

// required for IE, otherwise Content-Disposition may be ignored 
if(ini_get('zlib.output_compression')) 
ini_set('zlib.output_compression', 'Off'); 


// set headers 
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: application/zip'); 
header("Content-Disposition: attachment; filename=\"".basename($fileName)."\";"); 
header("Content-Transfer-Encoding: binary"); 
header('Accept-Ranges: bytes'); 
header("Content-Length: " . $fsize); 

// download 
$file = @fopen($fileName,"rb"); 
if ($file) { 
    while(!feof($file)) { 
print(fread($file, 1024*8)); 
flush(); 
if (connection_status()!=0) { 
    @fclose($file); 
    die(); 
} 
} 
@fclose($file); 
} 

答えて

1

私はあなたのコンテンツ長が本当に転送量よりも多くのバイトを報告することを考えて、この

<?php 

$file = "./SomeDir/Somefile.zip"; 
set_time_limit(0); 
$name = "Somefile.zip"; 

// Print headers and print to output. 
header('Cache-Control:'); 
header('Pragma:'); 
header("Content-type: application/zip"); 
header("Content-Length: ". filesize($file)); 
header("Content-Disposition: attachment; filename=\"{$name}\""); 
readfile($file); 

?> 
+0

お返事ありがとうございます。ダウンロードしたファイルが壊れているか無効でIEが突然ダウンロードを停止し、「ダウンロードが中断しました」と表示される – Rohan

+0

おそらく、別のコンテンツタイプを使用しようとしている可能性があります。アプリケーション/ application/octet-streamを使ってみてください。それが役に立っているかどうかを確認してください。 –

0

を試してみてください。 サーバーのログをチェックインします。サーバーはコンテンツをgzipでき、接続を閉じるとクライアントは残りの宣言されたバイトを待っています。

+0

この投稿はコメントです – marsei

関連する問題