Невозможно загрузить двоичный файл в PHP

Я должен зашифровать файл и сохранить его в mysql как blob, затем расшифровать его и сделать его доступным для загрузки. Я сохраняю файл в блобе так:

$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); 

И все отлично работает с текстовыми файлами, но результат пуст с двоичными файлами, хотя в блоке есть двоичный файл .

EDIT Моя догадка заключается в том, что, как только я дешифрую файл из db blob, php или html (из-за print_r ) понимают, что это двоичный файл и не позволяют вам показывать его из соображений безопасности. Вы не можете выполнять программы в Интернете, такие как .exe или .bin , хотя файлы, которые я загружаю, либо двоичные, либо текстовые, не имеют расширения. Из того, что я понимаю, php рассматривает двоичные файлы как строки, но file_get_contents является двоичным . Я думаю, что не использовать blobs было бы лучшим подходом для этого, но я не могу этого сделать, я должен использовать blobs.

EDIT 2 Проблема кажется openssl, которая, похоже, не похожа на двоичные данные, я пробовал один и тот же код с помощью mcrypt, и он отлично работает.

  1. Убедитесь, что вы дешифруете данные с помощью одного и того же ключа.
  2. Почему вы используете print вместо print_r ?

  3. Попытайтесь добавить длину контента:

    header ('Content-Length:' .strlen (YourFileData));

  4. Для получения дополнительной информации посетите: http://www.media-division.com/the-right-way-to-handle-file-downloads-in-php/