2017-03-14 3 views
2

nicht herunterladen Ich muss eine Datei verschlüsseln und in mysql als Blob speichern, entschlüsseln und zum Download bereitstellen. ich speichern Sie die Datei in einem Klecks wie folgt:Ich kann die Binärdatei in 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)); 

Anmerkung: Ich nicht verwandten Code geschnitten haben, die Tabelle nicht nur Zertifikat ist, aber ich will das nicht verwirrend bekommen.

Dies ist die Seite Download php ist:

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

Und alles funktioniert perfekt mit Textdateien, aber das Ergebnis ist leer mit Binär-Dateien, im Blob obwohl die Binärdatei ist es.

EDIT Meine Vermutung ist, sobald ich die Datei aus dem db Blob, PHP oder HTML (wegen print_r) versteht entschlüsseln, dass es sich um eine Binärdatei ist und lassen Sie nicht, dass Sie es zeigen, wegen der Sicherheit Gründe dafür. Sie können keine Programme im Internet wie .exe oder .bin ausführen, obwohl die Dateien, die ich hochlade, entweder binär oder Text, keine Erweiterung haben. Von was ich verstehe, PHP behandelt Binärdateien als Zeichenfolgen, aber file_get_contents ist binär sicher. Ich denke nicht, Blobs zu verwenden wäre der beste Ansatz dafür, aber ich kann das nicht tun, ich muss Blobs verwenden.

EDIT 2 Das Problem scheint openssl zu sein, die binäre Daten nicht zu mögen scheint, ich den gleichen Code versucht haben, mit mcrypt und es funktioniert perfekt.

Antwort

1
  1. Stellen Sie sicher, dass Sie die Daten mit demselben Schlüssel entschlüsseln.
  2. Warum verwenden Sie print anstelle von print_r?

  3. versuchen, den Inhalt Länge hinzuzufügen:

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

  4. Für weitere Informationen besuchen Sie bitte: http://www.media-division.com/the-right-way-to-handle-file-downloads-in-php/

+0

Danke für die Antwort. 1. Es ist der gleiche Schlüssel, ich benutze die Variable $ cipher, wo ich mehr als eine openssl mache. 2. Ich habe print_r in meinem Code verwendet, ich habe es auch mit dem Druck versucht, aber die gleiche Sache, Textdateien funktionieren, Binärdateien nicht. 3. Ich habe das ebenfalls hinzugefügt, funktioniert aber immer noch nicht mit Binärdateien (wieder haben Textdateien kein Problem, verschlüsselt zu werden, entschlüsselt. 4. Ich werde einen tiefen Einblick darin nehmen, danke Überprüfen Sie meine Bearbeitung. – Cr1xus

Verwandte Themen