2017-11-08 11 views
0

皆さん、今はいくつかの問題で動いています。サーバーの内部状況については、私がコントロールできないものがあります。コンテンツにはブラウザの制限があり、base64のエンコードされたファイルに直接影響するため、これらの文字列の長さのために、既存のbase64 pdfファイルをクライアントに提供するPHPスクリプトを作成しました。ダウンロード可能なファイル、およびそれだけでこのように働いた:私はPDFファイルを使用しますが、私は動作するように見えるいくつかの「XLSX」ファイルにそれを使用しようとすると、それはファイルをダウンロードするときConvertigがbase64をダウンロード可能なファイルに変換するPHP

$reg = File::find($args->string('id')); //querying the file from database 
    $filename = $reg->filename; //the original file name 
    $base64 = $reg->file; //the base64 encoded file 
    $meta_type = explode(',', $base64) [0]; //getting the meta type of the file 
    $meta_type = str_replace('data:', '', $meta_type); 
    $meta_type = str_replace(';base64', '', $meta_type); 
    $file = explode(',', $base64) [1]; 
    $file = base64_decode($base64); //decoding the base64 string 


    header('Content-Description: File Transfer'); 
    header('Content-Type: ' . $meta_type); 
    header('Content-Disposition: attachment; filename="' . $filename . '"'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . (strlen($file))); 
    echo $file; 

これは、うまく働いていましたファイルサイズとすべてが元のファイルと一致するようですが、ファイルを開くことはできませんが、誰かが私がここで行方不明のアイデアを持っていますか? :)

答えて

1

あなたの機能を終了しておらず、バッファをいっぱいにしているので、私はかなり起こっていると確信しています。あなたのストリームの準備ができたらすぐにスクリプトを停止し、バッファをきれいにして終了しなければなりません。

その場合は、有効なExcelファイルは、あなたがしなければならないすべては、次のとおりです。

header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Cache-Control: must-revalidate'); 
header('Expires: 0'); 
header('Pragma: public'); 
header('Content-Disposition: attachment; filename="' . $filename . '"'); 

if (ob_get_contents() || ob_get_length()) { 
    ob_end_clean(); //or ob_end_flush(); 
} 

exit(); 
+0

私はちょうどラインをコピーしていない「エコー$ファイル」の後に「)の出口(」持っている:Pを、私はまた、コンテンツの長さとコンテンツ記述のヘッダーにコメントをしようとしましたが、私はそれらを必要としませんし、エコーの前にob_end_clean()を使ってalfoを実行しましたが、ファイルはまだ破損しています – Strife86

+0

私はあなたに正しい回答フラグを与えますクリーンなバッファの潜在的な問題について知りませんでした。私はそれがとても有用だと信じていましたが、コードはそれだけで、 '$ file = base64_decode($ base64);というばかげたミスでした。それは '$ file = base64_decode($ file);' – Strife86

関連する問題