Prev: Fastest way to find out if a string contains a certain character?
Next: Do you have some standard for defined the variable in programlanguage?
From: =?UTF-8?B?RHXFoWFuIE5vdmFrb3ZpxIc=?= on 27 Jul 2010 10:58 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(a)gmail.com>: > 2010/7/27 DuÅ¡an NovakoviÄ <ndusan(a)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.
From: Richard Quadling on 27 Jul 2010 11:54 2010/7/27 DuÅ¡an NovakoviÄ <ndusan(a)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(a)gmail.com>: >> 2010/7/27 DuÅ¡an NovakoviÄ <ndusan(a)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.
From: Nilesh Govindarajan on 27 Jul 2010 12:35 Dude! I found the bug probably, you're using fopen() in 'r' mode which is meant to read ASCII text. Since PDF is a binary file (probably?), you should use binary mode. Try with mode = 'rb' in fopen(). -- Regards, Nilesh Govindarajan Facebook: http://www.facebook.com/nilesh.gr Twitter: http://twitter.com/nileshgr Website: http://www.itech7.com VPS Hosting: http://www.itech7.com/a/vps
From: =?UTF-8?B?RHXFoWFuIE5vdmFrb3ZpxIc=?= on 28 Jul 2010 02:51 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(a)gmail.com>: > 2010/7/27 DuÅ¡an NovakoviÄ <ndusan(a)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(a)gmail.com>: >>> 2010/7/27 DuÅ¡an NovakoviÄ <ndusan(a)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.
From: =?UTF-8?B?RHXFoWFuIE5vdmFrb3ZpxIc=?= on 28 Jul 2010 03:44
Ok, I found the problem :-) There was nothing wrong with storing or sending files, it's just that I tried to load file with jQuery on wrong way :-( Sorry once more to everyone :-( Dusan 2010/7/28 DuÅ¡an NovakoviÄ <ndusan(a)gmail.com>: > 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(a)gmail.com>: >> 2010/7/27 DuÅ¡an NovakoviÄ <ndusan(a)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(a)gmail.com>: >>>> 2010/7/27 DuÅ¡an NovakoviÄ <ndusan(a)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. > -- mob: + 46 70 044 9432 web: http://novakovicdusan.com Please consider the environment before printing this email. |