Blob file download problem

时间:2017-09-03 作者:Andrew Angelo Barrientos

我当前正在尝试下载保存在数据库中的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的二进制内容并将其全部显示为字符串,而不是浏览器提示输入文件下载位置。

有没有其他方法可以在wordpress上下载blob?

2 个回复
SO网友:Sebastian Kurzynowski

存在一些安全问题。请清理您的输入,因为有人可以从您的数据库下载不同于存档的内容,或者干脆删除您的数据库。

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

SO网友:Paul G.

在代码中使用以下内容类型标题:

header( "Content-type: application/octet-stream" );
如果这不起作用——我们成功地做到了这一点,尽管可能性不大,但这可能与事情的顺序有关。按以下顺序尝试:

Content-type
Content-disposition
Content-Transfer-Encoding
Content-Length
正如在另一个答案中所提到的,在将输入直接用于数据库查询之前,请始终对其进行清理。

已编辑:还添加以确保没有缓存(已执行from here)-

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

结束

相关推荐

如何自定义自定义php文件的页面标题

我正在创建一个自定义php/js页面,在第二个页面上查询和显示来自单独的非wordpress DB的结果。页眉和页脚将与我的主题相同,因此我调用了主题的页脚和页眉,但我还没有弄清楚为什么我自定义页面标题的钩子不起作用,并询问使用哪个钩子来显示我指定的标题。除了主题的页眉和页脚,我不需要调用wordpress中的任何内容(我不使用页面模板的原因之一)。我想是的require(\'../wp-blog-header.php\'); get_header(); add_filter( \'wp_