Я должен зашифровать файл и сохранить его в 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, и он отлично работает.
Почему вы используете print
вместо print_r
?
Попытайтесь добавить длину контента:
header ('Content-Length:' .strlen (YourFileData));
Для получения дополнительной информации посетите: http://www.media-division.com/the-right-way-to-handle-file-downloads-in-php/