谷歌浏览器下载CSV文件时出现错误:MIME类型为text/csv。

16

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

window.location.href = "url";

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

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

这段代码在除了Chrome浏览器以外的所有浏览器上都能正常工作,但在Chrome浏览器中会在控制台日志中返回以下错误信息:"Resource interpreted as Document but transferred with MIME type text/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变量吗? - Kaspar Mary
@KasparMary 不,它使用 GET 方法。 - Elliot
Chrome不允许下载吗?在Chrome中,我收到的是警告而不是错误。不确定如何修复它,但我仍然可以下载我的文件。 - Don Rhummy
三年后,这仍然是一个有效的问题。Chrome仍然会发出此警告。当我使用window.location.replace(url)在单击按钮时重定向到csv文件时,我会得到它。在我的情况下,后端是.NET。像@DonRhummy一样,我只是在开发者控制台中记录了一个警告,但文件下载正常。 - Qrt
如果你真的想要保存文件,我觉得将重定向到文件是一种不太正规的方法。你尝试过Downloads API了吗? - Andy
或者,您可以尝试使用 window.open(url, '_self'); - Andy
6个回答

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

0

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

头部("内容类型:应用程序/强制下载");


我现在遇到了这个错误:资源被解释为文档,但传输的 MIME 类型为 application/force-download:“ur”。 - Elliot
你在设置头之后接下来要做什么? - Andrej Bestuzhev
添加 Header("Content-Length: ".strlen($output)); - Andrej Bestuzhev
如果我将JavaScript调用更改为window.open(URL),它也可以工作,只是不是我想要的,因为您必须观看一个空屏幕,直到完成! - Elliot
这个想法是将 .csv 文件下载到浏览器,因此我使用:fputcsv($fp, $row); 打印到 CSV。 - Elliot
显示剩余5条评论

0

header("过期时间: 0");

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


0

尝试应用程序内容类型

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

同时允许用户公开访问,以便用户可以下载

header("Pragma: public");


0

我也遇到了同样的问题,但 Chrome 将其显示为警告而不是错误。我通过将标题更改为'Content-Type','text/plain'来成功停止了警告的显示。

令人恼火的是,这个问题在 OP 六年后仍然存在。


0
尝试使用readfile()读取生成的文件,并添加"content-length"头部。如果可以工作,那么您可能需要先写入文件,然后再进行输出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接