Write binary stream to browser using PHP
- by Dave Jarvis
Background
Trying to stream a PDF report written using iReport through PHP to the browser. The general problem is: how do you write binary data to the browser using PHP?
Working Code
The following code does the job, but (for many reasons) it is not as efficient as it should be (the code writes a file then sends the file contents the browser).
// Load the MySQL database driver.
//
java( 'java.lang.Class' )->forName( 'com.mysql.jdbc.Driver' );
// Attempt a database connection.
//
$conn = java( 'java.sql.DriverManager' )->getConnection(
"jdbc:mysql://localhost:3306/climate?user=$user&password=$password" );
// Extract parameters.
//
$params = new java('java.util.HashMap');
$params->put('DistrictCode', '101');
$params->put('StationCode', '0066');
$params->put('CategoryCode', '010');
// Use the fill manager to produce the report.
//
$fm = java('net.sf.jasperreports.engine.JasperFillManager');
$pm = $fm->fillReport($report, $params, $conn);
header('Cache-Control: no-cache private');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment, filename=climate-report.pdf');
header('Content-Type: application/pdf');
header('Content-Transfer-Encoding: binary');
header('Content-Length: ' . strlen( $result ) );
$path = realpath( "." ) . "/output.pdf";
$em = java('net.sf.jasperreports.engine.JasperExportManager');
$result = $em->exportReportToPdfFile($pm,$path);
readfile( $path );
$conn->close();
Non-working Code
To remove the slight redundancy (i.e., write directly to the browser), the following code looks like it should work, but it does not:
$em = java('net.sf.jasperreports.engine.JasperExportManager');
$result = $em->exportReportToPdf($pm);
header('Content-Length: ' . strlen( $result ) );
echo $result;
Content is sent to the browser, but the file is corrupt (it begins with the PDF header) and cannot be read by any PDF reader.
Question
How can I take out the middle step of writing to the file and write directly to the browser so that the PDF is not corrupted?
Thank you!