【问题标题】:Save file dialog box to appear after a MySQL data export (using PHP)MySQL 数据导出后出现的保存文件对话框(使用 PHP)
【发布时间】:2014-03-31 15:08:32
【问题描述】:

我已经找到了许多与此类似的问题的“部分”答案,但我是 PHP 和 MySQL 新手,似乎没有一个很好的大而连贯的答案;我想要做的是:

  1. 从名为“producers”的 MySQL 表中获取所有数据。
  2. 让用户在其本地计算机上选择文件名/“另存为”位置。
  3. PHP / MySQL / HTML 获取数据并将其作为 CSV 文件写入。

第 1 部分和第 3 部分很简单;但是让用户选择文件位置/文件名的方法似乎几乎是不可能的。用户选择要上传的文件在 HTML 中很简单,那么为什么我很难找到一种方法让用户选择“保存”位置/名称?这当然不是安全风险 - 从服务器下载的安全风险远低于将内容上传到服务器。

我希望能够使用漂亮而简单的 MySQL 方法,但我不知道如何将这个命令从 PHP 发送到 MySQL;只是把它放在 mysqli_query 中似乎没有任何作用:

SELECT prodCompany,prodPhone,prodFirstname FROM producers
INTO OUTFILE '/Users/me/Desktop/file.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

(此方法在 phpMyAdmin 中可以正常工作)。

所以我现在已经采用了笨拙的逐步 PHP 方法,该方法有效,但显然只会将“file.csv”保存到我的桌面。我读过关于 MIME 类型的奇怪提及,但我不确定这对我有什么帮助以及如何实现它。

我只想触发一个文件选择器对话框,将该文件路径/名称放入 $filename 变量中。但是经过几天的挫折之后,我找不到任何有效的方法。任何帮助或建议将不胜感激!

  • 保罗

保存到那个文件的 PHP:

<?php

// Create connection
$con=mysqli_connect("xxxxxxxxx","xxxxxxxxx","xxxxxxxxxxxxxx","xxxxxxxxxx");
// Check connection
if (mysqli_connect_errno())
    { echo "Failed to connect to MySQL: " . mysqli_connect_error(); }

$filename = '/Users/me/Desktop/file.csv';
$headers = array('prodCompany', 'prodPhone', 'prodFirstname');

$handle = fopen($filename, 'w');
fputcsv($handle, $headers, ',', '"');

$sql = mysqli_query($con, 'SELECT * FROM producers');

while($results = mysqli_fetch_array($sql)) {
    $row = array(
        $results['prodCompany'],
        $results['prodPhone'],
        $results['prodFirstname']
    );
    fputcsv($handle, $row, ',', '"');
}

fclose($handle);

?>

【问题讨论】:

  • 其实是有安全隐患的。如果浏览器可以写入任何目录,那么 javascript 可以写入任何目录。我认为这是真的。
  • 感谢 Ryan - 我没有意识到允许用户选择文件可能会允许 javacsript 写访问。马特,如果文件还不存在(它正在“动态”创建)怎么办?让 MySQL 首先在服务器上创建文件会更好(如果可能),一旦该过程完成,然后开始下载/文件选择过程?
  • @MattThompson,但是您可以从浏览器上运行的程序设置下载位置,还是用户至少必须响应下载提示?
  • @MattThompson,问题不是用户响应提示问题。他们希望以编程方式设置文件目标并绕过用户提示。这是可怕的一点。
  • 理想情况下,我会出现一个“保存对话框”,用户在文件名中选择一个位置/类型,然后将文件路径放入 $filename 变量中。然后 PHP 的其余部分进行实际保存。我当前的 PHP(显示在原始帖子中)完美运行(这是“强制写入客户端”吗?)但只将一个文件保存在那个位置。如果浏览器不实际保存某些内容,是否无法以某种方式触发“保存对话框”?

标签: php mysql csv dialog save


【解决方案1】:

好的,概念是您要生成一个 csv 并让用户保存它。

获取文件名的表单

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Example</title>
</head>

<body>
<form name="test" action="csv_gen.php" method="post">
    <label for="filename">File name </label>
  <input type="text" name="filename" id="filename" />
  <input type="submit" name="submit" value="go get file" />
</form>
</body>
</html>

处理和强制 csv 下载的脚本

<?php
if($_POST) {

    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='.$_POST['filename'].'.csv');

    //replace this with whatever generates your csv and print it
    echo "field1,field2,field3,field4,field5\n";

}
?>

这将执行强制下载。对于具有默认下载位置的较新浏览器(例如 Chrome),这将使用用户在表单字段中输入的任何文件名立即下载文件。然后他们将打开该位置并移动文件。这是非常标准的浏览器功能,我不会尝试覆盖。这可能会使那些设置了默认下载位置的人感到困惑。

希望这可以帮助您入门。

【讨论】:

  • 啊 - 我发现我做错了什么......我花了一段时间才弄清楚 PHP 脚本是纯 PHP - 我将它嵌入到 HTML 页面中,这破坏了一些东西。我尝试了一些关于使用 header('Content-Type... 的早期建议但没有成功。我没有看到它指出任何地方似乎不能在某些 HTML 中使用这个过程。再次感谢您的所有帮助!
【解决方案2】:

我最近在一个单文件 php 应用程序中遇到了类似的问题,其中所有表单都提交到同一个 index.php。提交表单后,我做了以下操作:

  1. 重新获取数据库结果
  2. 使用 fopen 在服务器某处创建名为“out.csv”的文件
  3. 将结果集的每一行写入out.csv
  4. 重定向到 out.csv 并带有:header("Location: relative_path_to_csv/out.csv");

默认保存对话框的显示方式与您创建文件链接并单击它时的显示方式相同。

缺点是如果多个用户同时调用它,相同的“out.csv”会被其他用户覆盖。解决方案是对文件名使用唯一标识符,并有一些过程来定期清理 csv 目录(cron 作业)。

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多