Re: storing files in database and retriving them

From: Date: Wed, 28 Jul 2010 06:51:12 +0000
Subject: Re: storing files in database and retriving them
References: 1 2 3 4  Groups: php.general 
Request: Send a blank email to php-general+get-307186@lists.php.net to get a copy of this message
Hi, Here are headers: Response Headers ---------------------------------------------------------------------------------------------------- Date Wed, 28 Jul 2010 06:41:33 GMT Server Apache/2.2.14 (Ubuntu) X-Powered-By PHP/5.3.2-1ubuntu4.1 Expires 0 Cache-Control must-revalidate, post-check=0, pre-check=0 Pragma no-cache Content-Length 1849 Accept-Ranges bytes Content-Disposition attachment; filename='10_file.pdf' Content-Transfer-Encoding binary Content-Encoding gzip Vary Accept-Encoding Content-Type application/pdf X-Cache .... X-Cache-Lookup .... Via .... Connection keep-alive Proxy-Connection keep-alive Request Headers ---------------------------------------------------------------------------------------------------- Host ....... User-Agent Mozilla/5.0 (X11; U; Linux i686; sv-SE; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 Accept text/html, */* Accept-Language sv-se,sv;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding gzip,deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 115 Proxy-Connection keep-alive Content-Type application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With XMLHttpRequest Referer http://........../user/queue/ Content-Length 5 Cookie PHPSESSID=67bf56153fb3b9c69ed214114c8154dd Dusan 2010/7/27 Richard Quadling <rquadling@gmail.com>: > 2010/7/27 Dušan Novaković <ndusan@gmail.com>: >> I don't think that it will help :-( I've tried to set different >> headers but still I end up with some strange response, like: >> >> %PDF-1.3 >> 3 0 obj >> <</Type /Page >> /Parent 1 0 R >> /Resources 2 0 R >> /Contents 4 0 R>> >> endobj >> 4 0 obj >> <</Filter /FlateDecode /Length 1214>> >> stream >> .... >> >> So, if we try to look into this problem as basic. For example, I'm >> trying to store file test.pdf from some location on server into my db >> like this: >> >> $fp = fopen(PATH_TO_PDF_FILE.'test.pdf', "r"); >> $size = filesize(PATH_TO_PDF_FILE.'test.pdf'); >> $type = mime_content_type(PATH_TO_PDF_FILE.'test.pdf'); >> >> $file = fread($fp, $size); >> >> Here if I do : var_dump($file) how the content should look like? >> >> $file = base64_encode($file); >> close($fp); >> >> $query = sprintf("INSERT INTO table SET >> file='%s', >> name='%s', >> size='%s', >> type='%s'", >>                        mysql_real_escape_string($file), >>                        mysql_real_escape_string('test.pdf'), >>                        mysql_real_escape_string($size), >>                        mysql_real_escape_string($type) >> ); >> mysql_query($query); >> >> >> >> And lets try to retrive data now and show them on page: >> >> $query  = sprintf("SELECT * FROM table WHERE >> id='something'"); >> $res= mysql_query($query); >> $row = mysql_fetch_assoc($res); >> >>  header("{$_SERVER['SERVER_PROTOCOL']} 200 OK", True, 200); >>  header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); >>  header('Content-Length: ' . $row['size']); >>  header('Content-Type: ' . $row['type']); >>  header('Expires: 0'); >>  header('Pragma: public'); >> >> header('Content-Description: File Transfer'); >> header('Content-Disposition: attachment; filename=" . $row['name']); >> header('Content-Transfer-Encoding: binary'); >> >>  readfile(base64_decode($row['file'])); >> >> >> And here I should get PDF file, but instead I get the same symbols on >> the top of page :-( >> >> Any suggestion? Some different header or ... ? >> >> >> 2010/7/27 Richard Quadling <rquadling@gmail.com>: >>> 2010/7/27 Dušan Novaković <ndusan@gmail.com>: >>>> hello, >>>> >>>> I have some problems with storing files in db and retriving them, so >>>> probably I'm doing something wrong :-) >>>> Here is the case: >>>> I have on one of the pages request to generate some PDF files and >>>> store them in database. So, I use FPDF to create files, and that's >>>> working perfect. Then my system is collecting generated file(s) and >>>> storing them in DB. On the other side (page)  I have to show stored >>>> files from database. >>>> >>>> So, when file (in this case PDF) is created and stored in some dir >>>> (ex. tmp/file.pdf), by using function: fopen(filename, 'r'); $file = >>>> fread(....); I put file(s) in array $tmpArray = array('file' => >>>> base64_encode($file).... ) and send it to model (db). There I have >>>> table for files, (column type for file is BLOB). So, first I do the >>>> $fileThatWillBeStored = base64_decode($file); and than store it. After >>>> that I'm able to see that in DB there is one row with file, so that >>>> part is also ok. >>>> On the other side when I have to show that file, I just fetch it from >>>> DB and again pack it in array, but first do the >>>> base64_encode($fileFromDB) and send it to controller, where after >>>> doing $file = base64_decode($fileFromDB); I just show it like this: >>>> header("Content-length: ".$file['file_size']); >>>> header("Content-type: ".$file['file_type']); >>>> header("Content-Disposition: attachment; filename= >>>> ".$file['file_name']); >>>> echo $file['file']; >>>> >>>> And final result is something like: >>>> >>>> %PDF-1.3 >>>> 3 0 obj >>>> <</Type /Page >>>> /Parent 1 0 R >>>> /Resources 2 0 R >>>> /Contents 4 0 R>> >>>> endobj >>>> 4 0 obj >>>> <</Filter /FlateDecode /Length 1214>> >>>> stream >>>> x��W�v�F �� �L ��[�� N ��`' >>>> �,{�� $�H�g� �/x�R?$� �Y� ��n=�U0t9"X ��h >>>> �O�)�  ��5���  � � �Q:��2B!U��( I)0 >>>> >>>> ..... >>>> >>>> >>>> So, I hope you get the picture :-) Of course, I've skiped lot of >>>> steps, because the code is huge. >>>> >>>> Any suggestions? additional questions? >>>> >>>> P.S. >>>> I can't read on the other side file from directory, so it has to be in >>>> the way I just described ( Generate PDF with FPDF => pack in array, >>>> but first base64_encode => send it to model => get from array and >>>> unpack it with base64_decode on DB side => store in DB, and then >>>> reverse: get from DB => pack in array, but first base64_encode => send >>>> it to controller => get it from array and unpack with base 64_decode >>>> => show in view with headers) >>>> >>>> Thnx, >>>> Dusan >>>> >>>> >>>> -- >>>> mob: + 46 70 044 9432 >>>> web: http://novakovicdusan.com >>>> >>>> Please consider the environment before printing this email. >>>> >>>> -- >>>> PHP General Mailing List (http://www.php.net/) >>>> To unsubscribe, visit: http://www.php.net/unsub.php >>>> >>>> >>> >>> As soon as you've got the data, create a hash of the file (sha1(), >>> md5(), etc.) and store that in the database. >>> >>> When you restore the file, generate a new hash and compare it with the >>> stored one to make sure you've got the right data. >>> >>> Assuming that the hashes match, then the next thing is to use a tool >>> like FireBug to see EXACTLY what is being received by the client. This >>> seems to be different to what you are sending. >>> >>> The headers I use for a PDF file download (as compared to a PDF online >>> view) are ... >>> >>>        header("{$_SERVER['SERVER_PROTOCOL']} 200 OK", True, >>> 200); >>>        header('Cache-Control: must-revalidate, post-check=0, >>> pre-check=0'); >>>        header('Content-Length: ' . filesize($a_FPN['PDF'])); >>>        header('Content-Type: application/pdf'); >>>        header('Expires: 0'); >>>        header('Pragma: public'); >>> >>>        // Force a Save Dialogue if that is required.. >>>        if ('True' === $b_Save) >>>                { >>>                header('Content-Description: File Transfer'); >>>                header('Content-Disposition: attachment; >>> filename="Jobsheet ' . >>> $s_OrderNumber . '.pdf"'); >>>                header('Content-Transfer-Encoding: binary'); >>>                } >>> >>>        readfile($a_FPN['PDF']); >>> >> >> >> >> -- >> mob: + 46 70 044 9432 >> web: http://novakovicdusan.com >> >> Please consider the environment before printing this email. >> > > Like I said ... if you don't think there is a problem with what you > are SENDING, take a look at the browser and see what it is > RECEIVING... > > For that, any of the good browsers will allow you to see the headers > of a request. What headers are you RECEIVING. > > Chrome and FireFox/FireBug would be the tools I'd be looking at next. > > If not, then WireShark - but that would be overkill. > > Anything in the middle (caching, proxy server, firewalls, A/V s/w) > COULD be changing the header. Probably not, but at least this way you > could report back EXACTLY what the client is receiving. > -- mob: + 46 70 044 9432 web: http://novakovicdusan.com Please consider the environment before printing this email.

« previous php.general (#307186) next »