Fin
Fin

Reputation: 386

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

I want to retrieve a ZIP file with PHP from a MSSQL database wich is stored in a IMAGE field.

In this part i make a connection using sqlsrv, send a query, and move to the first row and get the first field in BINARY encoding.

$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));

At this point the zip is retrieved as a resource stream and here i get stuck.

When i set the headers and output the content, the browser downloads the zip.

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

This works like a charm, the zip works perfect.

But what i want is to open the zip serverside without the user having to dowload it. So when i just try to write the content to a file:

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

It can't be opened. I figured that when the browser downloads the given content, it encodes it someway. Alltrough i can not figure out how to do that while writing it to a file.

If someone has any solutions to write the resource stream to a file on the server side in the proper way, that would be great.

Upvotes: 0

Views: 276

Answers (1)

Sander
Sander

Reputation: 388

This should solve the problem:

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

Upvotes: 1

Related Questions