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

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

$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 Я предполагаю, что как только я расшифрую файл из блоба базы данных, php или html (из-за print_r) понимает, что это двоичный файл, и не позволяет вам показывать его из-за безопасности причины. Вы не можете запускать программы в Интернете, такие как .exe или .bin, хотя файлы, которые я загружаю, будь то двоичные или текстовые, не имеют расширения. Насколько я понимаю, php обрабатывает двоичные файлы как строки, но file_get_contents безопасен для двоичных файлов. Я думаю, что лучше всего для этого не использовать BLOB-объекты, но я не могу этого сделать, я должен использовать BLOB-объекты.

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


person Cr1xus    schedule 14.03.2017    source источник


Ответы (1)


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

  3. Попробуйте добавить длину содержимого:

    header('Длина содержимого: '.strlen(YourFileData));

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

person Ahmad    schedule 14.03.2017
comment
Спасибо за ответ. 1. Это тот же ключ, я использую переменную $ciphers, где я делаю более одного openssl. 2. Я использовал print_r в своем коде, я пробовал и с print, но то же самое, текстовые файлы работают, а бинарные файлы - нет. 3. Я также добавил это, но все еще не работает с двоичными файлами (опять же, текстовые файлы не имеют проблем с шифрованием и расшифровкой. 4. Я внимательно прочитаю это, спасибо. Проверьте мое редактирование. - person Cr1xus; 15.03.2017