Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

How to load compressed file from Oracle BLOB with PHP

Posted on 2011-02-15
12
1,264 Views
Last Modified: 2012-05-11
Hello everyone.

I am trying to load a blob from an Oracle database. This blob actually contains a file (can be pdf, png, doc, etc.). They are small files, < 1mb. I am able to get their filename and filetype.

However, it seems like they are compressed in the database. Is it possible to "un-compressed" them and then download those files?

Here is my simple php script that will get an attachment. When I load the page, I have the good filename + size that I can save to my computer, but the filename seems corrupted and I cannot use it. So I am pretty sure that it is compressed.

<?php
$Attachment = new Sysattachment();
$allAttachments = array();
$allAttachments = $Attachment->getAllAttachmentFromId('IM530717');

header("Content-length: {$allAttachments[1]['SIZEPRGN']}");
header("Content-type: {$allAttachments[1]['MIMETYPE']}");
header("Content-Disposition: attachment; filename={$allAttachments[2]['FILENAME']}");
$foo = "";
                   
while(!$allAttachments[2]['DATAPRGN']->eof()){
    $foo .= $allAttachments[2]['DATAPRGN']->read(2000);
}
print $foo;
?>

Open in new window


Can we un-compress a file from the database? With the Select Statement?
0
Comment
Question by:Etdashou
  • 7
  • 3
12 Comments
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 34901880
What compression algorithm was used before the data was put into the data base?
0
 
LVL 76

Accepted Solution

by:
slightwv (䄆 Netminder) earned 500 total points
ID: 34906808
If they are compressed then, as posted above, you need to know how to uncompress them.  Oracle doesn't compress BLOBs on insert.

My guess is the code doing the extract is interfering/corrupting the data.  It's also possible that the code that inserted them is corrupting them.

Try using PL/SQL to write out a few of them and check them for validity:
http://www.dba-oracle.com/t_writing_blob_clob_os_file.htm
0
 
LVL 1

Author Comment

by:Etdashou
ID: 34906843
hmm, I will try to discover what is the compression algorithm. I will let you know what I discover.

Also I will follow your link.
0
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 
LVL 1

Author Comment

by:Etdashou
ID: 34907712
I don't know if this help, but this is the response I got from the support of the software that does the compression:

When attachments are compressed in our software the functions that perform this compression reference the zlib compression library, an open source free to invoke lossless compression library.

Therefore to uncompress the attachments a utility that references this library can be used, for example gzip from Gnu, or built to extract the full size attachment.

If I can get the content with PHP, can I un-compress it with a php function?

Thank you
0
 
LVL 76

Expert Comment

by:slightwv (䄆 Netminder)
ID: 34907737
Looks like the BLOBs are compressed.  No need to use the PL/SQL to extract them as a test.


I'm not a php person but looks like there is a zlib library available:

http://php.net/manual/en/book.zlib.php
0
 
LVL 1

Author Comment

by:Etdashou
ID: 34907789
I tried the function gzuncompress but  I still don't have a good result... If anyone can help, I would greatly appreciate.

<?php
$Attachment = new Sysattachment();
$allAttachments = array();
$allAttachments = $Attachment->getAllAttachmentFromId('IM530717');

header("Content-length: {$allAttachments[1]['SIZEPRGN']}");
header("Content-type: {$allAttachments[1]['MIMETYPE']}");
header("Content-Disposition: attachment; filename={$allAttachments[1]['FILENAME']}");
$foo = "";
                   
while(!$allAttachments[1]['DATAPRGN']->eof()){
    $foo .= $allAttachments[1]['DATAPRGN']->read(2000);
}
print gzuncompress($foo);
?>

Open in new window

0
 
LVL 1

Author Comment

by:Etdashou
ID: 34907803
And I have this error message if I don't add the "CONTENT" header.


Warning: gzuncompress() [function.gzuncompress]: data error in \attachment\load.php on line 21
0
 
LVL 1

Author Comment

by:Etdashou
ID: 34907856
hmmm...

I may need to solve a problem before.

Here is my SQL Statement:
$sql = oci_parse($c, "select \"SYSATTACHMEM1\".\"TOPIC\", \"SYSATTACHMEM1\".\"APPLICATION\", \"SYSATTACHMEM1\".\"DATAPRGN\", \"SYSATTACHMEM1\".\"MIMETYPE\", \"SYSATTACHMEM1\".\"SIZEPRGN\", \"SYSATTACHMEM1\".\"FILENAME\", \"SYSATTACHMEM1\".\"DATE_ADDED\" from SYSATTACHMEM1 where \"SYSATTACHMEM1\".\"TOPIC\"='$id'");
		
$resultat = oci_execute($sql);

Open in new window


If I run this query, it works, but I have a error message displayed:
Warning: Unknown: OCI_INVALID_HANDLE in Unknown on line 0

If I remove this part of the sql statement: \"SYSATTACHMEM1\".\"DATAPRGN\"

And run the sql again, i don't have the error message. DATAPRGN is the actual file content, so perhaps their is something I need to do for this?

Tahnk you.
0
 
LVL 1

Author Comment

by:Etdashou
ID: 34920196
Ok,

Forget about the OCI_INVALID_HANDLE. I was assigning an object from the SQL call...

That said, I now have an array like that:

Array ( [TOPIC] => IM530717 [MIMETYPE] => image/gif [SIZEPRGN] => 1285 [FILENAME] => dashboard.gif [DATAPRGN] => "a lot of stuff that I can't read... Example: _RCFM*=.BxÚs÷t³°LT`P`øοÆÆÆVVVNNN.n®ÎÞ¾žžž...etc")

I need to be able to download the DATAPRGN now, but I always have a corrupted file.
The company say it is zlib compression. So I try this:

header("Content-length: {$allAttachments[1]['SIZEPRGN']}");
header("Content-type: {$allAttachments[1]['MIMETYPE']}");
header("Content-Disposition: attachment; filename={$allAttachments[1]['FILENAME']}");
echo gzuncompress($allAttachments[1]['DATAPRGN']);

But it doesn't work.

I hope you guys understand and if I need to be more clear about all that, please tell me.
0
 
LVL 76

Expert Comment

by:slightwv (䄆 Netminder)
ID: 34920591
Sorry.  I'm out since this now appears to be strictly PHP related.

I suggest you use the 'Request Attention' link above to see if a Moderator can stir up some new Experts for you.
0
 
LVL 1

Author Closing Comment

by:Etdashou
ID: 34945468
This help me but did not totally solve my problem. I have a new questions opened now.
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Row insertion failed. Array 5 46
format dd/mm/yyyy parameter 16 30
date show only hh:mm 2 25
PHP 7 issue seeing runtime MS SQL driver in PHP info page 5 11
These days socially coordinated efforts have turned into a critical requirement for enterprises.
This article discusses how to create an extensible mechanism for linked drop downs.
This video shows information on the Oracle Data Dictionary, starting with the Oracle documentation, explaining the different types of Data Dictionary views available by group and permissions as well as giving examples on how to retrieve data from th…
This video shows how to Export data from an Oracle database using the Original Export Utility.  The corresponding Import utility, which works the same way is referenced, but not demonstrated.

840 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question