这是我编写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;
}
答案 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() );
}