强制下载csv文件总是不起作用

时间:2018-03-13 07:45:51

标签: php

这是我编写csv文件然后下载它的函数。我有一个下拉菜单$ _REQUEST ['page_start_date']和$ _REQUEST ['page_end_date']。在某些选项文件下载中,在其他选项中则没有。问题是这部分始终正常

foreach ( $employees as $employee ) {
   fputcsv( $file, $employee );
}   

我在本地服务器上写文件内容。这就是为什么我不明白为什么文件有时会下载,有时却没有。

function crb_export_employees() {
$start_date = $_REQUEST['page_start_date'];
$end_date   = $_REQUEST['page_end_date'];

$employees = crb_get_employees_started_in_date_range( $start_date, $end_date 
);
$filePath = CRB_THEME_DIR . 'employees.csv';

$file = fopen( $filePath, 'w+');
foreach ( $employees as $employee ) {
    fputcsv( $file, $employee );
}

fclose( $file );

header( 'Cache-Control: public' );
header( "Content-type: application/x-msdownload", true, 200 );
header( 'Content-Disposition: attachment; File Transfer' );
header( 'Content-Disposition: attachment; filename="employees.csv"' );
header( "Pragma: no-cache");
header( "Expires: 0");

readfile( $filePath );

wp_safe_redirect( wp_get_referer() );
exit;
}

1 个答案:

答案 0 :(得分:0)

我认为如果文件大小相对较小,则对readfile的单个调用通常有效,但如果文件较大,则以块的形式读取文件会更可靠。以下代码部分是我用了一段时间来强制下载csv文件 - 它以小块的形式读取,直到达到eof标记。

function crb_export_employees() {
    $start_date = $_REQUEST['page_start_date'];
    $end_date   = $_REQUEST['page_end_date'];

    $employees = crb_get_employees_started_in_date_range( $start_date, $end_date );
    $filepath = CRB_THEME_DIR . 'employees.csv';

    $file = fopen( $filepath, 'w+');
    foreach ( $employees as $employee ) {
        fputcsv( $file, $employee );
    }
    fclose( $file );



    if( !is_file( $filepath ) or connection_status()!=0 ) return FALSE;

    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Pragma: no-cache");
    header("Expires: 0");
    header("Content-Type: application/octet-stream");
    header("Content-Length: ".(string)( filesize( $filepath ) ) );
    header("Content-Disposition: inline; filename=employee.csv");
    header("Content-Transfer-Encoding: binary\n");

    if( $file = @fopen( $filepath, 'rb' ) ) {
        while( !@feof( $file ) and ( connection_status()==0 ) ) {
            print( fread( $file, 1024*8 ) );
            flush();
        }
        @fclose( $file );
    }

    wp_safe_redirect( wp_get_referer() );

    return( ( connection_status()==0 ) and !connection_aborted() );
}