2012-03-29 5 views
0

バイナリファイルをbase64にエンコードしてPHPページ(インラインコード)に入れたいのですが、そのページをリクエストするとブラウザにファイルがストリームされ、ダウンロードダイアログがポップアップします。
任意のアイデアバイナリファイルをPHPページにエンコードする

+0

は、私はアイデアをしたい – MrBassam

+2

まあそれは印刷BASE64_DECODE(「02FAF ....」)は 'だ;'と、そのファイルがあなたのPHPインタプリタに使用可能なメモリよりも大きい場合に実行可能ではありません。 – mario

+0

Mario、このusegulのコメントはコメントではなく、回答そのものを投稿してください:) – Gian

答えて

1

かなり簡単です。 readfileと同様に、httpヘッダーを使用してダウンロードを強制し、エンコードされた文字列をエコーし​​ます。

$decoded_data = base64_decode($encoded_data); 

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . strlen($decoded_data); 
ob_clean(); 
flush(); 
echo $decoded_data; 
exit; 
+1

私はこれをすぐにdownvoteしませんが、あなたがそれを修正しない場合は...あなたはデータの長さを取得するために、一度出力してください。変数に 'base64_decode()'の結果を格納し、その変数を 'strlen()'と 'echo'に渡す必要があります。もしデータが100MBだったらどうなりますか? – DaveRandom

+0

良い点。ファイル全体がメモリにロードされるので、大きなファイルに対してはこれをお勧めしませんが、少なくともこの方法では1回だけデコードされます。 – Juhani

+0

私は個人的にはこれを絶対に推奨しませんでしたが、これを行う理由はほとんどありません。私はそれが潜在的に素晴らしいことを認めます(これは、私がこれを行うために考えることができる唯一の正当な理由です)しかし、小さな美的利得と大きなパフォーマンスコストは、それが実際に実行可能ではありません。しかし、ちょっと工夫すればあなたの答えは良いです - 文字列がスクリプト内で静的で、ファイルの提供に大きなオーバーヘッドがあり、FYIにそのようなHTTPヘッダーがないので、キャッシュヘッダーがクライアントのキャッシュに向かう方が良いでしょう「コンテンツ転送エンコーディング」として – DaveRandom

関連する問題