2017-03-01 6 views
3

現在、リモートサーバーからファイルをダウンロードできる機能を作成しています。私のスクリプトは、必要なすべてのファイルタイプで正常に動作しますが、何らかの理由でmsgファイルでは機能しません(空のファイル(0K)をダウンロードします)。ところで、ChromeとIEの同じ動作。私は問題がファイルサイズであると思ったので、大きなzipファイルをダウンロードするためにテストしたところ、うまくいきました。PHPでmsgファイルをダウンロードするには

マイスクリプト:

私が間違ってやっていますか?

P.S.私は可能な解決策は、プロセスをアップロード中に.zgファイルをアーカイブしてから.zipとしてダウンロードすることですが、私はより良い解決策を探しています。

+0

ない答えが、あなたのスクリプトのための提案:あなたがサニタイズする必要があり、あなたの '$ _GETのようなものを渡して誰かを避けるために[ 'file_nameに']' '../ passwd' –

+2

PHP以外の方法でPHPスクリプトが実行されているサーバーからリモートサーバーから.msgファイルをダウンロードできますか? 'wget http:// mypath/uploads/test.msg'で?私はあなたのスクリプトをローカルファイルでテストしました。 '$ file_url = 'test.msg';'、これはここで働いているので、リモートサーバから取得するのに問題があると思われます。 'readfile'の戻り値をチェックすることもできます。もし' false'であれば、ファイルを読み込む際にエラーが発生します。 –

+0

スクリプトをテストしましたが、リモート 'msg'ファイルをダウンロードします。 nginx + php 5.6。スクリプトがファイルをダウンロードするためのアクセス権を持っていますか?もしそれが 'mypath'のサーバであれば' .msg'ファイルは与えられません。 –

答えて

3

が答えにmy commentを拡大試してみよう:cURLを使用して

を私は例えば、ローカルファイルを使用してスクリプトをテストしました。 $file_url = 'test.msg';、これはここで動作しています。だから私はリモートサーバーからファイルを取得する問題があると思われる。あなたのPHPスクリプトがPHP以外の方法で実行されているサーバからリモートの.msgファイルをダウンロードできますか? wget http://mypath/uploads/test.msg? readfile-if it is false, there is an error reading the fileの戻り値をチェックすることもできます。ファイルをダウンロードできない場合、またはreadfileがfalseを返す場合は、問題はコード内ではなく、サーバー構成または接続の問題です。これは最初に修正する必要があります。

コードについて:$_GET['file_name']を消毒して、誰かが../passwdのようなものを渡さないようにしてください。

2

は別のコンテンツ・タイプを使用してみてください。

header("Content-Type: application/download"); 
+0

私はちょうど別のヘッダーを使用しようとしましたが、喜び、同じ問題はまだありません! –

+0

@DenissMuntjansはこれを試してみました:) – EL3PHANTEN

+0

まだ同じですが、それは空のmsgファイルをダウンロードします! –

3

あなたはfopen wrappersが有効になっている場合にのみ可能であるURLファイルの場所、とreadfileを使用しようとしています。 PHP readfileから

fopen wrappers が有効になっている場合

ヒント URLは、この関数のファイル名として使用することができます。 のファイル名の指定方法の詳細については、fopen()を参照してください。さまざまなラッパーの能力に関する情報へのリンクへの のSupported Protocols and Wrappers、その使用方法に関する の注釈、および が提供する事前定義済みの変数に関する情報へのリンクを参照してください。

それは安全ではありません、あなたは、ローカル・システム・パスは次のようにURLのinsted使用する必要があります。

// Get parameter form html page 
if(isset($_GET['file_name'])) $file_name = $_GET['file_name']; 

$file_name = str_replace('"', '\\"', $file_name); 
//$file_url = 'http://mypath/uploads/' . $file_name; 
// The script is located to one level up directory of the uploads directory 
// You can change this to fit your script and uploads directory locations 
$uploads_local_path = __DIR__.'/uploads/'; 
$file_path = $uploads_local_path.$file_name; 

header('Content-Type: application/octet-stream'); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
header("Content-Transfer-Encoding: Binary"); 

readfile($file_path); 
exit; 

、今それが動作し、ファイルをダウンロードします。注意して、ディレクトリの正しいパスの場所を持ってください。 http://zikro.gr/dbg/php/dl-file/

は、ダウンロード・スクリプトへの直接リンクは、あなたが試すことができます:

あなたも、ここにあなたのコードに基づいて、私の地元の例を試してみて、ファイルをダウンロードすることができhttp://zikro.gr/dbg/php/dl-file/dodl.php?file_name=1011191_orig.png

1

をおそらく愚かな質問が、あなたを持っていますシンプル

$fileurl="http://example.com/file.msg"; 
$fileContent = file_get_contents($fileurl); 
file_put_contents($saveDir.$fileName, $fileContent); 

http://php.net/manual/en/function.file-get-contents.php

を試してみました0

1

ユーザーエージェントを追加し、要求に応じてすべてのMIMEタイプを受け入れるようにしてください。

// Get parameter form html page 
if(isset($_GET['file_name'])) $file_name = $_GET['file_name']; 

$file_name = str_replace('"', '\\"', $file_name); 
$file_url = 'http://mypath/uploads/' . $file_name; 

header('Content-Type: application/octet-stream'); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
header("Content-Transfer-Encoding: Binary"); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $file_url); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0'); 
$headerData[] = 'Accept: */*'; 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerData); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$data = curl_exec ($ch); 
$error = curl_error($ch); 
curl_close($ch); 
echo $data; 
exit; 
1

// Get parameter form html page 
if(isset($_GET['file_name'])) $file_name = $_GET['file_name']; 

$file_name = str_replace('"', '\\"', $file_name); 
$file_url = 'http://mypath/uploads/' . $file_name; 

header("Content-Type: application/download"); 
header("Content-disposition: attachment; filename=\"".$file_name."\""); 
header("Content-Transfer-Encoding: Binary"); 

readfile($file_url); 
exit; 
0

私はContent-Lengthヘッダーを指定する必要があると思います。無効にするとキャッシュが有効になると思います。例えば

header("Content-length: " . strlen($output); // tells file size 
header("Pragma: no-cache"); 
header("Expires: 0"); 
関連する問題