Blob-Datei-Download-Problem

Ich versuche gerade, eine in der database gespeicherte BLOB-Archivdatei herunterzuladen

$fid = $_GET['fid']; $sel = $wpdb->get_results( "SELECT * FROM uploads WHERE id = $fid" ); foreach( $sel as $head ) { $name = $head->name; $type = $head->type; $size = $head->size; $content = $head->content; header("Content-length: $size"); header("Content-type: $type"); header("Content-Transfer-Encoding: Binary"); header("Content-Disposition: attachment; filename=$name"); echo $content; exit; } 

Jedes Mal, wenn ich nach /download?id= mit int-Wert, der id zugewiesen wurde, lädt er die Datei. Statt jedoch den Browser nach dem Speicherort für den Datei-Download zu fragen, liest die Seite den binären Inhalt des Blobs und zeigt ihn als String an.

jede andere Möglichkeit, einen Blob auf WordPress herunterzuladen?

Solutions Collecting From Web of "Blob-Datei-Download-Problem"

Es gibt einige Sicherheitsprobleme. Bitte bereinigen Sie Ihre Eingaben, da jemand aus Ihrer database etwas anderes als das Archiv herunterladen oder Ihre database einfach löschen kann.

$fid = sanitize_text_field( $_GET['fid'] );

Verwenden Sie den folgenden Content-Type-Header in Ihrem Code:

 header( "Content-type: application/octet-stream" ); 

Wenn das nicht funktioniert – wir tun dies erfolgreich und obwohl es unwahrscheinlich ist, kann es mit der Reihenfolge der Dinge zusammenhängen. Probieren Sie es in der folgenden Reihenfolge aus:

 Content-type Content-disposition Content-Transfer-Encoding Content-Length 

Und wie in der anderen Antwort erwähnt – sanitize immer Eingabe, bevor Sie es direkt in databaseabfragen verwenden.

Bearbeitet: Auch hinzufügen, um sicherzustellen, dass es kein Caching gibt ( von hier ) –

 header('Connection: Keep-Alive'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); 

Bearbeitet: Fügen Sie den Code in eine function ein, die bei ‘init’ ausgeführt wird, damit er nicht im Theme-Inhalt ausgegeben wird.

 add_action( 'init', function () { global $wpdb; $fid = sanitize_text_field( $_GET[ 'fid' ] ); $sel = $wpdb->get_results( "SELECT * FROM uploads WHERE id = $fid" ); foreach ( $sel as $head ) { $name = empty( $head->name ) ? 'myfile.name' : $head->name; $size = empty( $head->size ) ? strlen( $head->content ) : $head->size; header( 'Content-Type: application/octet-stream' ); header( "Content-Disposition: attachment; filename=$name" ); header( 'Content-Transfer-Encoding: Binary' ); header( "Content-Length: $size" ); header( 'Connection: Keep-Alive' ); header( 'Expires: 0' ); header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' ); header( 'Pragma: public' ); echo $head->content; exit(); } } );