在 Joomla 框架内强制 PHP 下载文件

2023-11-21

我有一些 PHP 代码,可以在数据库上运行查询,将结果保存到 csv 文件,然后允许用户下载该文件。问题是,csv 文件包含实际 csv 内容周围的页面 HTML。

我已经在这里阅读了所有相关问题,包括this one。不幸的是,我的代码存在于 Joomla 中,因此即使我尝试重定向到仅包含标题的页面,Joomla 也会自动用自己的导航代码包围它。这只发生在下载时;如果我查看服务器上保存的 csv 文件,它不包含 HTML。

谁能帮助我找到一种方法来强制下载服务器上的实际 csv 文件,而不是浏览器正在编辑的文件?我尝试过使用标题位置,如下所示:

header('Location: ' . $filename);

但它在浏览器中打开文件,而不是强制保存对话框。

这是我当前的代码:

//set dynamic filename
$filename = "customers.csv";
//open file to write csv
$fp = fopen($filename, 'w');

//get all data
$query = "select 
   c.firstname,c.lastname,c.email as customer_email, 
   a.email as address_email,c.phone as customer_phone,
   a.phone as address_phone,
   a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin
   from {$dbpre}customers c
   left  join  {$dbpre}customers_addresses a  on c.id = a.customer_id  order by c.last_signin desc";

$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;
while ($row = mysql_fetch_array($votes,1)) {
    //put header row
    if ($counter == 1){
       $headerRow = array();
       foreach ($row as $key => $val)
          $headerRow[] = $key;
       fputcsv($fp, $headerRow);
    }
    //put data row
    fputcsv($fp, $row);
    $counter++;
}

//close file
fclose($fp);

//redirect to file
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=".$filename);
header("Content-Transfer-Encoding: binary");
readfile($filename); 
exit;

EDITS完整网址如下所示:

http://mysite.com/administrator/index.php?option=com_eimcart&task=customers

实际的下载链接如下所示:

http://mysite.com/administrator/index.php?option=com_eimcart&task=customers&subtask=export

更多编辑这是代码所在页面的截图;生成的文件仍然会拉入子菜单的 html。所选链接的代码(导出为 CSV)现在是

index.php?option=com_eimcart&task=customers&subtask=export&format=raw

alt text

现在这是生成的保存文件的屏幕截图:

alt text

它在上传过程中缩小了,但以黄色突出显示的文本是子导航的 html 代码(列出客户、添加新客户、导出为 csv)。这是我的完整代码现在的样子;如果我能去掉最后一点 html 那就完美了。

  $fp= fopen("php://output", 'w');

            $query = "select c.firstname,c.lastname,c.email as customer_email, 
                      a.email as address_email,c.phone as customer_phone,
                      a.phone as address_phone,  a.company, a.address1,
                      a.address2,a.city,a.state,a.zip,c.last_signin

                      from {$dbpre}customers c
                      left  join  {$dbpre}customers_addresses a on c.id = a.customer_id  
                      order by c.last_signin desc";

            $votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
            $counter = 1;

            //redirect to file
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename=customers.csv");
             header("Content-Transfer-Encoding: binary");

            while ($row = mysql_fetch_array($votes,1)) {

                    //put header row
                    if ($counter == 1){
                            $headerRow = array();
                            foreach ($row as $key => $val)
                                    $headerRow[] = $key;

                            fputcsv($fp, $headerRow);
                    }

                    //put data row
                    fputcsv($fp, $row);
                $counter++;
            }

            //close file
            fclose($fp);

比约恩的更新

这是对我有用的代码(我认为)。在调用该操作的链接中使用 RAW 参数:

index.php?option=com_eimcart&task=customers&subtask=export&format=raw

因为这是程序性的,所以我们的链接位于名为customers.php 的文件中,如下所示:

switch ($r['subtask']){
    case 'add':
    case 'edit':
        //if the form is submitted then go to validation
                include("subnav.php");
        if ($r['custFormSubmitted'] == "true")
            include("validate.php");
        else
            include("showForm.php");
        break;

    case 'delete':
                include("subnav.php");
        include("process.php");
            break;

    case 'resetpass':
                include("subnav.php");
        include("resetpassword");
            break;

    case 'export':
        include("export_csv.php");
            break;


    default:
                include("subnav.php");
        include("list.php");
        break;
}

因此,当用户单击上面的链接时,会自动包含export_csv.php 文件。该文件包含所有实际代码:

<?
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=customers.csv");
header("Content-Transfer-Encoding: binary");
$fp= fopen("php://output", 'w');


//get all data
$query = "select 
    c.firstname,c.lastname,c.email as customer_email, 
    a.email as address_email,c.phone as customer_phone,
    a.phone as address_phone,
    a.company,a.address1,a.address2,a.city,a.state,a.zip, c.last_signin

    from {$dbpre}customers c

    left  join  {$dbpre}customers_addresses a  on c.id = a.customer_id  order by c.last_signin desc";


$votes = mysql_query($query) or die ("File: " . __FILE__ . "<br />Line: " . __LINE__ . "<p>{$query}<p>" . mysql_error());
$counter = 1;

while ($row = mysql_fetch_array($votes,1)) {

    //put header row
    if ($counter == 1){
        $headerRow = array();
        foreach ($row as $key => $val)
            $headerRow[] = $key;

        fputcsv($fp, $headerRow);
    }

    //put data row
    fputcsv($fp, $row);
    $counter++;
}

//close file
fclose($fp);

这是我刚刚编写的一段示例代码来帮助您。将其用作控制器中的操作方法。

function get_csv() {
        $file = JPATH_ADMINISTRATOR . DS . 'test.csv';

        // Test to ensure that the file exists.
        if(!file_exists($file)) die("I'm sorry, the file doesn't seem to exist.");

        // Send file headers
        header("Content-type: text/csv");
        header("Content-Disposition: attachment;filename=test.csv");

        // Send the file contents.
        readfile($file);
    }

仅此还不够,因为您下载的文件仍将包含周围的 html。要摆脱它并仅接收 csv 文件的内容,您需要在请求中添加 format=raw 参数。就我而言,该方法位于 com_csvexample 组件内部,因此 url 为:

/index.php?option=com_csvexample&task=get_csv&format=raw

EDIT

为了避免使用中间文件替代

//set dynamic filename
$filename = "customers.csv";
//open file to write csv
$fp = fopen($filename, 'w');

with

//open the output stream for writing
//this will allow using fputcsv later in the code
$fp= fopen("php://output", 'w');

使用此方法,您必须在将任何内容写入输出之前移动发送标头的代码。您也不需要致电readfile功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Joomla 框架内强制 PHP 下载文件 的相关文章

  • symfony2 选择单选框的默认值

    我的项目是使用 Silex 和 Symfony 组件 即表单组件 编写的 我尝试创建一组从类中构建的单选按钮 并且我想预先选择其中一个单选按钮 我创建这样的表格 form app form factory gt createBuilder
  • 当错误较多时,Laravel 不会显示错误。这是 Bug?

    重复的https github com laravel framework issues 31123 https github com laravel framework issues 31123 Laravel 版本 6 8 0 6 10
  • 用于分页的php示例脚本[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以建议一个好的分页 php 脚本 其中人们想要分页显示数据库中的大量项目 以下链接可以帮助您
  • 当存在联系时如何为数组分配排名号

    当尝试为数组中存在平局的数值分配排名时 我很难知道从哪里开始 因此 例如 我需要像下面这样转换一个数组 myarray 4 76 34 13 34 到另一个数组中 例如 myarray2 1 5 3 5 2 3 5 基本上 当相同的数字在数
  • PHP 有效读取 csv 文件

    有几种使用 PHP 读取 CSV 文件的方法 我以前用过explode函数将每一行放入一个数组中 然后explode逗号并使用trim删除数据周围的任何引号 本来就很乱 PHP 5 现在有fgetcsv和 str getcsv 我猜这是这些
  • 基于 PHP 的 CSV 编辑器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道用 PHP 编写的在线 CSV 编辑器允许用户打开 编辑和保存给定的 CSV 文件 我能找到的只
  • mongodb对话系统

    我正在实施一个verymongodb 上的简单对话系统 这个想法应该是 当我打开一个 convo 时 它应该显示发送和接收的消息 到目前为止一切正常 并且应该非常容易 通过使用像这样的伪代码这样的简单查询 from my id AND to
  • 如何在Web服务中传递URL

    我想将此 URL 作为网址中的值传递http localhost h2orn php verify php email emails hash hash但是 我只能在 符号之前传递 我想传递所有 URL 我正在使用java网络服务 代码在这
  • 为什么我应该使用 $_GET 和 $_POST 而不是 $_REQUEST? [复制]

    这个问题在这里已经有答案了 除此之外 REQUEST从 cookie 读取 有什么理由我应该使用 GET and POST代替 REQUEST 这样做的理论和实践理由是什么 当我只想让用户的某些数据返回某些数据时 我使用 REQUEST 当
  • FPDF - 内嵌粗体文本

    我正在尝试从 PHP 创建 PDF 出于法律原因 我们需要将免责声明的一部分设为粗体 并且需要概述免责声明 我当前的代码使用 if isset POST optout POST optout yes pdf gt Ln 5 pdf gt S
  • 如何将 ctype_alpha 与 UTF-8 结合使用

    如何将 ctype alpha 与 UTF 8 一起使用 我有这个代码 if empty POST false if isset POST first name empty POST first name if ctype alpha PO
  • 适用于 Windows 的 PHP 支持的 GUI 应用程序

    我知道 PHP 是一种解释性语言 对于基于 Web 的事物来说 不是为在实际操作系统上运行 GUI 应用程序而设计的 但是有没有办法呢 基本上 是否有一个框架 系统允许我创建 本机 基本上是二进制文件 exe 看起来像带有本机控件和所有内容
  • PHP header() 和 jquery mobile

    我想使用 php header Location newpage php 进行重定向 我没有收到错误 但 Jquery mobile 似乎无法加载目标页面 并且地址栏仍保留旧地址 请问您有什么建议吗 Thanks 尝试添加data ajax
  • 如何在 Laravel 5 中处理嵌套的 JSON 对象请求?

    我们在 Laravel 5 和 AngularJs Ionic 中运行此 Web 服务来处理 Web 当我们将请求从 Web 客户端 发送到 Web 服务 后端 时 我们传递了嵌套的 JSON 对象 我们在读取服务器端父对象下的所有子对象时
  • cURL '格式错误的网址'

    This url 在浏览器中工作得很好 但 cURL 返回错误 3 格式错误的 url 关于解决方法有什么想法吗 EDIT 卷曲代码 function get web page url options array CURLOPT RETUR
  • 我可以显示我在 PHP 中设置的所有 cookie 吗?

    我正在尝试诊断 cookie 中的错误 但 cookie 的名称不是应有的名称 PHP 有没有办法打印我的域设置的所有 cookie 你有没有尝试过 print r COOKIE
  • 如何覆盖 phpunit 中导出的变量?

    我知道我可以设置环境变量 https phpunit de manual current en appendixes configuration html在我的 phpunit xml 里面
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • 避免 SQLite3 中的 SQL 注入

    我正在尝试找出一种避免 SQL 注入的好简单方法 到目前为止我只能提出两个想法 对用户输入进行 Base64 编码 其实不想这样做 使用正则表达式删除不需要的字符 目前正在使用这个 不确定是否100 安全 这是我当前的代码
  • Laravel 5 注销特定用户

    在我的 laravel 5 应用程序中 有一个功能允许具有管理员角色的用户重置非管理员的任何人的密码 但这不会强制该人注销并再次登录 更改密码后如何强制用户注销 我没有对用于验证用户身份或任何内容的中间件进行任何更改 我不知道它是否有效 但

随机推荐

  • 如何从不在现场的节点拍摄快照

    情况是这样的 我有一个Mesh and PointLight添加到窗格中 我想从窗格中拍摄快照并在图像视图中显示结果 但只有当我将窗格添加到场景中时它才起作用 有没有办法从尚未添加到场景中的节点拍摄快照 根据文件节点快照 注意 为了使 CS
  • 查找循环队列中的元素数量

    如何找到循环队列中的项目数 前后 并不总是有效 有没有一个公式可以根据数组的前 后和大小来知道循环队列中有多少个元素 实际上尺寸是 size front gt rear MAX front rear 1 rear front 1 或者可以采
  • 如何在不使用任何外部工具的情况下使用批处理文件压缩(/ zip)和解压缩(/ unzip)文件和文件夹?

    我知道类似的问题在这里被问了很多 但我对答案 甚至是问题 并不完全满意 主要目标是兼容性 它应该适用于尽可能广泛的 Windows 机器 包括XP Vista and 服务器2003 仍然占据大约 20 的 Windows 份额 并且生成的
  • 在Python中,如何获取列表中出现次数最多的内容,并以这种方式对其进行排序?

    3 3 3 4 4 2 将会 3 3 4 2 2 1 输出应按从最高计数到最低计数的顺序排序 在这种情况下 3比2比1 您可以使用Counter在 Python 2 7 中 这个食谱适用于 2 5 from collections impo
  • 从 gulp 中使用 browserify 时如何向浏览器公开“require”?

    当我有一个如下所示的文件 x js 时 x js module exports function n return n 111 我从命令行运行 browserify 如下所示 browserify r x js gt bundle js 我
  • WinForms 应用程序的常见漏洞

    我不确定这是否是主题 但它是如此特定于 NET WinForms 因此我相信它在这里比在 Security stackexchange 站点更有意义 此外 它与安全编码 我认为这与我在网站上看到的常见网站漏洞的任何问题一样切题 多年来 我们
  • UINavigationBar 在 AppDelegate.swift 中设置自定义阴影

    我想在整个应用程序的 UINavigationBar 底部设置一些阴影 这是我尝试过但不起作用的方法 func application application UIApplication didFinishLaunchingWithOpti
  • docker autobuild 与 git private 子模块

    我在 GitHub 上有两个私有存储库 名为dashboard and ui 我定义了ui作为 git 子模块dashboard 我将 docker 配置为自动构建dashboard关于特定分支上的每个更改 我读过这个文档https doc
  • 会话欺骗 (PHP)

    我正在用 PHP 编写一个包含布尔值的网站 SESSION logged in 这被设置为true当数据库中存在用户名和密码匹配时 我对会话相当陌生 只是想知道未注册 或者注册 用户是否可以通过将此布尔值设置为来绕过登录过程true 就像
  • 角度 $http POST 到 target="_blank"

    我需要做一个POST从 Angular 到 URL makeFile php它将根据其中提供的信息创建一个包含数据库查询内容的文件POST data PHP 强制浏览器打开一个保存对话框 而不仅仅是显示以下两行响应 header Conte
  • 确定在 Tkinter 中按下了哪个按钮?

    我在学习 Python 的同时制作了一个简单的小实用程序 它动态生成按钮列表 for method in methods button Button self methodFrame text method command self pop
  • PHP scandir() 和 htmlentities():字符集和/或特殊字符的问题

    我在用jquery文件树显示服务器上的目录列表以及目录中文件的下载链接 最近我遇到了包含特殊字符的文件的问题 test pdf 工作正常 t st pdf 不起作用 注意文件名中的 重音符号 在调试 jqueryFileTree 的 php
  • Python 中的字符串混淆

    我有一个必须传递给方法的密码字符串 一切正常 但我觉得以明文形式存储密码不太舒服 有没有办法混淆字符串或真正加密它 我知道混淆可以进行逆向工程 但我认为我至少应该尝试稍微掩盖密码 至少它对于索引程序或快速浏览我的代码的杂散眼来说是不可见的
  • 如何在android项目api 3(android 1.5)中使用Base64(自api 8(2.2)起包含在android中)?

    我需要在我的应用程序上使用 Base64 import android util Base64 但是 Base64 包含在 android 2 2 中 api lvl 8 然后 当我进行导入时 我收到此错误 Base64 无法解析 并且不让
  • 每个VST SDK似乎都是针对C++的,那么C#呢?

    我想开始制作 VSTi 更具体地说 midi 那些不产生任何声音而只是将 midi 数据输出到其他 vst 插头 琶音器 和弦工具等 的 现在我刚刚买了 C 书籍 认为这将是一门不错的语言 不仅仅是 vst 编程 但每个人都一直说 C 是正
  • 如何以编程方式卸载flutter中的应用程序?

    我正在 flutter 中构建一个启动器应用程序 但我无法添加卸载功能 请帮我 添加权限在manifest file
  • 清理 SQL 数据

    谷歌出现了各种关于清理网络访问查询的讨论 但我没有找到任何解决我所关心的问题的内容 在 C 程序中清理用户输入数据 这必须通过可逆转变来完成 而不是通过移除来完成 作为问题的一个简单例子 我不想破坏爱尔兰名字 最好的方法是什么 是否有任何库
  • 将图像绘制到面板控件上会在调整大小时产生伪像

    目前我正在尝试做我认为简单的任务 将图像绘制到整个区域Panel control在 Windows 窗体中 请暂时忽略我可以使用BackgroundImage财产 要绘制的图像如下所示 IE 一个黄色框 周围有 1 像素蓝色框 为了绘图 我
  • 在 GCC 中编译而不生成输出文件

    gcc c somefile c无需链接即可编译并生成相应的somefile o 是否可以编译文件gcc不生成任何输出文件 我知道还有其他方法可以实现此目的 但我很好奇是否有一个标志专门用于正在经历寻找错误 警告的源代码 您可能会喜欢 fs
  • 在 Joomla 框架内强制 PHP 下载文件

    我有一些 PHP 代码 可以在数据库上运行查询 将结果保存到 csv 文件 然后允许用户下载该文件 问题是 csv 文件包含实际 csv 内容周围的页面 HTML 我已经在这里阅读了所有相关问题 包括this one 不幸的是 我的代码存在