Проблема с загрузкой файла Blob

В настоящее время я пытаюсь загрузить файл архива blob, сохраненный в базе данных

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

каждый раз, когда я перенаправляю на /download?id= когда значение int, присвоенное id загружает файл. Однако вместо того, чтобы браузер запрашивал местоположение загрузки файла, страница считывает двоичное содержимое blob и отображает все это как строку.

любой другой способ загрузки blob на wordpress?

Solutions Collecting From Web of "Проблема с загрузкой файла Blob"

Есть некоторые проблемы с безопасностью. Пожалуйста, дезинформируйте свой ввод, потому что кто-то может загрузить из вашей базы данных нечто иное, чем архив, или просто отбросить вашу базу данных.

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

Используйте в своем коде следующий заголовок типа содержимого:

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

Если это не сработает – мы успешно это сделаем, и хотя это маловероятно, это может быть связано с порядком вещей. Попробуйте в следующем порядке:

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

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

Отредактировано: Также добавьте, чтобы не было кеширования (взято отсюда ) –

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

Отредактировано: Подключите код к функции для запуска в 'init', чтобы она не выводилась в содержание темы.

 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(); } } );