使用PHP从MSSQL IMAGE字段中写入ZIP作为BINARY STREAM检索

时间:2015-08-20 08:42:23

标签: php sql-server zip fwrite

我想从存储在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将作为资源流被检索,在这里我被卡住了。

当我设置标题并输出内容时,浏览器会下载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);

无法打开。我认为当浏览器下载给定内容时,它会对其进行编码。 Alltrough我无法弄清楚如何在将其写入文件时这样做。

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

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

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