У меня есть база данных MSSQL, которая хранит файлы в поле изображения (это был не я!). Я написал скрипт, который читает это поле в PHP с использованием ODBC и выводит файл прямо в браузер.
$conn = odbc_connect( $dsn, $user, $pass );
// setting this higher will hit the PHP memory limit
// I could set this higher but the files could be too large for RAM
// Looking for an alternative that will work for any size file
odbc_longreadlen( 0 , 100000000 );
$result = odbc_exec( $conn, "SELECT imageField FROM filesTable;" );
$file = odbc_fetch_array( $result );
// File type and name
header( "Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" );
header( "Content-Disposition: attachment; filename=spreadsheet.xlsx" );
// Disable caching
header( "Cache-Control: no-cache, no-store, must-revalidate" ); // HTTP 1.1
header( "Pragma: no-cache" ); // HTTP 1.0
header( "Expires: 0" ); // Proxies
odbc_close( $conn );
die( $file['imageField'] );
Моя проблема заключается в том, что для некоторых файлов у меня не хватает памяти в PHP. Я мог бы поднять предел, но мне интересно, есть ли лучший способ. Это работает до тех пор, пока файлы меньше 100000000 байт. Я хочу решение, которое работает для любого размера.
Можно ли читать строки или поля в патронах? Моя идея состоит в том, чтобы прочитать в патронах и вывести их во временный файл на диске, а затем отправить его пользователю.
Задача ещё не решена.
Других решений пока нет …