2017-03-14 29 views
2

ファイルを暗号化してblobとしてmysqlに保存し、解読してダウンロードできるようにする必要があります。PHPでバイナリファイルをダウンロードできません

$certificate_tmp=$_FILES['certificate']['tmp_name']; 
$certificate=openssl_encrypt(file_get_contents($certificate_tmp),$ciphers,$password_tmp); 
$wpdb->insert("my_table",array("certificate"=>$certificate)); 

注: 私はそうのようなブロブ内のファイル保存、私は関係のないコードをカットしましたが、テーブルは単に証明書ではありませんが、私は、これは混乱を取得する必要はありません。

これは、ダウンロードPHPのページです:

$password_tmp=$_SESSION['pwd']; //decrypt password 
global $wpdb; //wordpress db conncetion 
$results_file = $wpdb->get_row("select * from my_table where id='$id'",ARRAY_A); //i get the id from wp's curr_user 
$m_file = openssl_decrypt($results_file['certificate'],"AES-128-CBC",$password_tmp); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\certificate".$id."\""); 
header('Content-Transfer-Encoding: binary'); 
print_r($m_file); 

およびBLOBにバイナリファイルががあるが、すべてがテキストファイルで完璧に動作しますが、結果はバイナリファイルで空になって、

EDIT 私の推測では、それはバイナリファイルであることを理解し、あなたがあるため、セキュリティのそれを表示することはできませんとすぐに私が(理由print_rの)デシベルブロブ、PHPやHTMLからファイルを復号化として、あります理由。 .exeや.binのようなWeb上でプログラムを実行することはできませんが、アップロードしたファイル(バイナリまたはテキスト)には拡張子はありません。 phpがバイナリファイルを文字列として扱いますが、file_get_contentsバイナリセーフです。 私はブロブを使用していないと思うが、これは最善のアプローチですが、私はそれを行うことはできません、私はブロブを使用する必要があります。

EDIT 2 問題は、バイナリデータを好きなようには見えないopensslが、私はmcryptを使用して同じコードを試してみたことのようですし、それが完璧に動作します。

答えて

1
  1. 同じキーを使用してデータを復号化していることを確認してください。
  2. なぜprint_rの代わりにprintを使用しますか?

  3. は、コンテンツの長さを追加しよう:

    ヘッダ( 'のContent-Length:'(YourFileData).strlen)。

  4. 詳細についてご覧ください。答えを http://www.media-division.com/the-right-way-to-handle-file-downloads-in-php/

+0

感謝を。 1.同じキーです。複数のopensslを実行する変数 '$ ciphers'を使用します。 2.私は自分のコードでprint_rを使っていましたが、私もprintで試しましたが、同じこと、テキストファイルは動作します、バイナリファイルはありません。 3.これも追加しましたが、バイナリファイルではまだ動作しません(テキストファイルは暗号化され、解読されても問題ありません)。 4.それを深く読んでいただき、ありがとうございます。 私の編集をチェックしてください。 – Cr1xus

関連する問題