从作为二进制流检索的 MSSQL IMAGE 字段中使用 PHP 写入 ZIP

write ZIP with PHP from MSSQL IMAGE field retrieved as BINARY STREAM

我想从存储在 IMAGE 字段中的 MSSQL 数据库中检索带有 PHP 的 ZIP 文件。

在这部分中,我使用 sqlsrv 建立连接,发送查询,然后移动到第一行并获取 BINARY 编码的第一个字段。

$conn = sqlsrv_connect($sql['s'],array('Database'=>$sql['db'],'UID'=>$sql['usr'],'PWD'=>$sql['pwd']));

$q = 'SELECT TOP 1 FileContent
    FROM dbo.tblDocumentContent
    WHERE FileContent IS NOT NULL
    ORDER BY CreateDate DESC';

$res = sqlsrv_query($conn, $q);
sqlsrv_fetch($res);
$zip = sqlsrv_get_field($res,0,SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY));

此时 zip 被作为资源流检索,我卡在这里了。

当我设置 headers 并输出内容时,浏览器会下载 zip。

header("Content-type: application/zip, application/octet-stream");
header("Content-Disposition: attachment; filename=test.zip;");
fpassthru($zip);

这很有魅力,拉链很完美。

但我想要的是在用户无需下载的情况下打开 zip 服务器端。 因此,当我尝试将内容写入文件时:

$file = fopen('test.zip', 'a');
fwrite($file, fpassthru($zip));
fclose($file);

打不开。我认为当浏览器下载给定的内容时,它会以某种方式对其进行编码。一直以来,我都不知道在将它写入文件时该怎么做。

如果有人有任何解决方案以正确的方式将资源流写入服务器端的文件,那就太好了。

这应该可以解决问题:

$file = fopen('test.zip', 'w');
while (!feof($img)) {
    $chunk = fread($img, 1024);
    fwrite($file, $chunk);
}
fclose($img);
fclose($file);