【问题标题】:CSV Downloaded To Chrome - Error: MIME Type text/csvCSV 下载到 Chrome - 错误:MIME 类型文本/csv
【发布时间】:2013-01-16 19:14:45
【问题描述】:

我正在使用 jQuery 来识别单击按钮,然后触发对文件的调用:

window.location.href = "url";

此文件查询数据库,返回结果,然后将其写入 CSV 文件。我设置了以下标题:

header('Content-Type: text/csv;');
header('Content-Disposition: attachment; filename=data.csv');

这适用于除 Chrome 之外的所有浏览器,它在控制台日志中返回以下错误“资源解释为文档但使用 MIME 类型文本/csv 传输:“url””。

奇怪的是,如果我直接调用该文件,它可以在所有浏览器中运行。

代码:

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

                header('Content-Type: text/csv;');
                header('Content-Disposition: attachment; filename=data.csv');
                header("Expires: 0");
                header("Cache-control: private");

                //Field Headers
                $ncols = oci_num_fields($stid);
                $headers_row = array();
                for ($i = 1; $i <= $ncols; ++$i) {

                    $headers_row[] = oci_field_name($stid, $i); 

                }

                while ($row = oci_fetch_array($stid, OCI_NUM+OCI_RETURN_NULLS)) {

                    if(!empty($row)){
                        if(!empty($headers_row)){
                            fputcsv($fp, $headers_row);
                            $headers_row = '';
                        }

                        fputcsv($fp, $row);
                    }

                }

                fclose($fp);                    
                oci_close($conn);

有人有什么想法吗?

【问题讨论】:

  • 您在查询部分使用了任何 SESSION 变量?
  • @KasparMary 不,它使用 GET。
  • chrome不允许下载吗?在 chrome 中,我将此作为警告,而不是错误。不知道如何修复它,但我仍然可以下载我的文件。
  • 三年后,这仍然是一个有效的问题。 Chrome 仍然会给出这个警告。我在单击按钮时使用 window.location.replace(url) 重定向到 csv 文件时得到它。就我而言,后端是 .NET。就像@DonRhummy 一样,我只是在开发者控制台中收到一条警告,但文件下载正常。
  • 如果你真的想保存文件,我觉得重定向到一个文件是 hacky。你试过Downloads API吗?

标签: php google-chrome csv mime-types


【解决方案1】:
try {
    $conn = new PDO("mysql:host=$servername;dbname=db_1", $username, $password);
    //set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    //echo "Connected successfully"; 
    }
catch(PDOException $e)
    {
      echo "Connection failed: " . $e->getMessage();
    }


$query = $conn->prepare("SELECT * FROM csv_filds order by id asc");
$query->execute();
$data = "";
 while($row=$query->fetch(PDO::FETCH_BOTH)){ 
  $data .= $row['id'].",".$row['Name'].",".$row['father_name'].",".$row['address']."\n";
}
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="csvfile.csv"');
echo $data; exit();

【讨论】:

    【解决方案2】:

    尝试生成文件的 readfile() 并添加标题“content-length”。 如果它有效,那么您可能必须先写入文件,然后再进行输出。

    【讨论】:

      【解决方案3】:

      尝试应用程序内容类型

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

      也是用户公共访问,因此用户可以下载

      header("Pragma: public");

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,但 chrome 将其显示为警告而不是错误。我设法通过将标题更改为'Content-Type', 'text/plain' 来停止显示警告。 很烦人,这个问题在操作后仍然存在大约 6 年。

        【讨论】:

          【解决方案5】:

          header("Expires: 0");

          header("缓存控制:私有");

          【讨论】:

            【解决方案6】:

            header("content-type: application/force-download");

            【讨论】:

            • 我现在收到此错误:资源解释为文档但使用 MIME 类型应用程序/强制下载传输:“ur”
            • 设置标题后接下来要做什么?
            • 查询数据库时,我将标题设置在文件的顶部。
            • 在发送标头之前查询的更好方法。您可能会收到错误,因此您可以控制它并仅在一切正常后发送标头。另外,你不会忘记打印数据吗?
            • 好的,我在输出到 CSV 之前将它移到了,但仍然出现同样的错误。
            猜你喜欢
            • 1970-01-01
            • 2018-04-08
            • 2013-05-24
            • 2013-05-25
            • 1970-01-01
            • 1970-01-01
            • 2010-09-28
            • 1970-01-01
            相关资源
            最近更新 更多