通过电子邮件发送 .csv 后,如何使用 PHP 下载 .csv 文件? [关闭]

Posted

技术标签:

【中文标题】通过电子邮件发送 .csv 后,如何使用 PHP 下载 .csv 文件? [关闭]【英文标题】:How to cause a .csv file to be downloaded using PHP after sending the .csv via email? [closed] 【发布时间】:2011-09-23 12:39:09 【问题描述】:
$mailflg = $SiteObj->Sendsmtpmail($FromMail,$Email,"Check",$trackerCode,$smtpDetails);

if(!$mailflg)

    $myFile = "../csv/".$my_file_name;
        $smtpDetails['Test'] = "FAIL";
    $file = @fopen($myFile, "a");
    if($file)
    
        fwrite($file,$smtpDetails['HOST']. ",".$smtpDetails['USER'].",".$smtpDetails['PASSWORD'].",".$smtpDetails['PORT'].",".$smtpDetails['NOEMAIL'].",".$smtpDetails['SSL'].",".$smtpDetails['FROM'].",".$smtpDetails['Test']. "\r\n");
        fclose($file);
    

else

    $myFile = "../csv/".$my_file_name;
    $smtpDetails['Test'] = "SEND";
    $file = @fopen($myFile, "a");
    if($file)
    
        fwrite($file,$smtpDetails['HOST']. ",".$smtpDetails['USER'].",".$smtpDetails['PASSWORD'].",".$smtpDetails['PORT'].",".$smtpDetails['NOEMAIL'].",".$smtpDetails['SSL'].",".$smtpDetails['FROM'].",".$smtpDetails['Test']. "\r\n");
        fclose($file);
    

电子邮件发送后,如何将 .csv 文件下载到客户端计算机? (打开文件对话框)

【问题讨论】:

请提供您希望完成的任务的完整描述,并说明未按预期工作的原因。 【参考方案1】:

要将 CSV 文件发送到浏览器,您需要提供适当的标头,然后将其数据发送到输出缓冲区:

// Your other file handling code above here....
if($file)

  fwrite($file,$smtpDetails['HOST']. ",".$smtpDetails['USER'].",".$smtpDetails['PASSWORD'].",".$smtpDetails['PORT'].",".$smtpDetails['NOEMAIL'].",".$smtpDetails['SSL'].",".$smtpDetails['FROM'].",".$smtpDetails['Test']. "\r\n");
  fclose($file);

  // The file was written and closed, now send it to the browser...
  header("Content-type: text/csv");
  header("Content-description: File Transfer");
  header("Content-disposition: attachment; filename=\"thefilename.csv\"");
  header("Pragma: public");
  header("Cache-control: max-age=0");
  header("Expires: 0");

  // readfile() will progressively read from disk and send data to the output buffer
  readfile($myFile);

【讨论】:

不工作,实际上我得到了我的设计页面代码,而不是用户名、密码等部分 @user817442 我不知道你在说什么。您的问题是如何让浏览器提示保存 CSV 文件。我的代码正是这样做的。 @cwallenpoole 的回答也是如此。 你可以在fclose之后复制粘贴@Michael的答案 我想在我的 csv 文件中写入主机、用户、密码,对。之后我想下载那个csv文件我得到了下载提示但是当我得到那个下载的文件时我得到了我的设计页面代码的数据...... @LawrenceGS 指出要下载 CSV,将我的代码粘贴到您的 fclose() 之后,文件将被发送到浏览器。【参考方案2】:

通常以这种方式下载 CSV:

/* Set your headers: */
//Content type.
header("Content-type: application/csv");
//replace file.csv with whatever you want to have as a file.
header("Content-Disposition: attachment; filename=file.csv");
// Prevent caching.
header("Pragma: no-cache");
header("Expires: 0");

readfile('/path/to/file');

【讨论】:

【参考方案3】:

我想在我的 csv 文件中写入主机、用户、密码,对。之后我想下载那个 csv 文件我得到了下载提示但是当我得到那个下载的文件时,我用我的设计页面代码得到了那个数据...... -

我试图猜测你的意思,所以我针对你的情况提供了 3 种我能想到的可能性。

1) 如果你的意思是当你从命令行运行 CSV 文件时它可以工作,但是当你使用浏览器时,它会显示你的 php 代码,请确保你的 web 服务器设置为正确运行 PHP 代码。制作一个类似 test.php 的测试程序:

<?php echo 'Test Output'; ?>

并确保您在浏览器中看到的只是“测试输出”,而不是 php 代码。 PHP 3+ 要求打开标签默认包含单词“php”,这与之前的版本相反,您可以只使用问号。

已经给出的答案是正确的,不应导致下载文件中出现 PHP 代码。

2) 如果“设计页面代码”是指在浏览器中看到 html 和其他非 PHP、非 CSV 输出,请确保在提供 CSV 标头后不再向浏览器输出任何数据在前面的答案中给出。例如,输入“退出”;紧跟在 readfile 或 get_file_contents 之后。

这将防止在您下载的 CSV 文件中显示任何额外的 HTML 等。在编写 CSV 文件以供下载的代码部分中,您无法控制下载后的浏览器行为。您需要在提供下载框之前在 HTML 中执行此操作,例如,如果您放置一个显示下载 CSV 链接的页面,那么您可以在链接上使用 javascript 控制浏览器,或者让它停留在当前页面上.

3) 如果通过“设计页面代码”表示文件并未真正下载,并且您在浏览器的网页上看到 CSV,请确保您的脚本没有向浏览器输出任何内容在 CSV 输出之前的“header()”函数调用之前。例如,确保没有 PHP print() 或 echo() 调用,并且 PHP 文件中的开始 php 标记之前或任何包含文件的结束标记之后没有空白链接。通常在仅用作包含文件的 PHP 文件中,出于这个原因,您甚至不应该放置结束标记。

http://www.sitepoint.com/should-you-close-your-php-code-tags/

【讨论】:

以上是关于通过电子邮件发送 .csv 后,如何使用 PHP 下载 .csv 文件? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从 html 表单发送带有 csv 附件的电子邮件

如何使用 PHP 发送 100000 封邮件 [重复]

配置 php.ini 后无法通过 localhost 发送电子邮件

如何修改 xampp 以使用 php 发送邮件?

PHP 确认邮件

使用 PHP 读取二进制电子邮件附件 (CSV)