导出MySQL数据后出现保存文件对话框(使用PHP)

时间:2014-03-31 15:08:33

标签: php mysql csv dialog save

我找到了很多" partial"回答与此类似的问题,但我是PHP和MySQL的新手,并且它似乎并不是一个很好的大连贯答案;我想要做的是:

  1. 从名为" producer"。
  2. 的MySQL表中获取所有数据
  3. 让用户选择文件名/'另存为'在当地机器上的位置。
  4. PHP / MySQL / HTML获取数据并将其作为CSV文件写入。
  5. 第1部分和第3部分很容易;但是让用户选择文件位置/文件名似乎几乎不可能。用户选择要上传的文件在HTML中很简单,那么为什么我很难为用户找到一种方法来选择" save"地点名称?当然这不是安全风险 - 从服务器下载远比将内容上传到服务器的安全风险小得多。

    我希望能够使用漂亮而简单的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);
    
    ?>
    

2 个答案:

答案 0 :(得分:0)

好的,这个概念是你要生成一个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),这将使用用户在表单字段中输入的任何文件名立即下载文件。然后他们将打开该位置并移动文件。这是非常标准的浏览器功能,我不会尝试覆盖。它可能会混淆为下载设置默认位置的人。

希望这有助于您入门。

答案 1 :(得分:0)

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

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

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

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