Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP/MSSQL] pdf uit mssql database halen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb op een php pagina een script gemaakt waarmee een gebruiker een pdf document kan selecteren en deze dan in mijn mssql database opslaat.
Dat geselecteerde pdf-document zet ik om met de volgende manier en wordt dan opgeslagen in een image column;

code:
1
2
3
4
$filename = $_FILES["pdf"]["tmp_name"]; 
$datastring = file_get_contents($filename; 
$arrdata = unpack("H*hex", $datastring); 
$content = "0x".$arrdata['hex'];


Vervolgens heb ik op een andere pagina de code gemaakt zodat je het ingestuurde pdf document ook weer kan bekijken. Dat heb ik via de volgende manier gemaakt;

code:
1
2
3
4
5
6
7
8
9
10
11
12
$query = odbc_exec($conn, "SELECT name, size, type, document FROM documents WHERE id='". $id ."'");
while (odbc_fetch_row($query)) {
    $filename = odbc_result($query,"name");
    $filesize = odbc_result($query,"size");
    $filetype = odbc_result($query,"type");
    $filedata = odbc_result($query,"document ");
    
    header("Content-Length: ". $filesize ."");
    header("Content-Type: ". $filetype ."");
    header("Content-Disposition: attachment; filename=". $filename ."");
    echo $filedata;
}


Dit werkt goed op pdf documenten die niet groter zijn dan 500kb.
Wanneer een pdf document groter is dan 500kb dan wilt hij het document niet ophalen en krijg je een fout bij het downloaden van het bestand.

Het vreemde is wanneer ik het pdf document ophaal via een vb.net applicatie dan krijg ik wel gewoon het pdf document in beeld ook als hij groter is dan 500kb. Dus de pdf wordt goed opgeslagen in mijn database.

Zit er in php een limiet dat hij met bestanden groter dan 500kb niet overweg kan om zo te laten zien?
Of heeft iemand een gouden tip hoe ik ervoor kan zorgen dat hij bestanden groter dan 500kb ook kan openen?

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Misschien een idee om de fout hier ff te melden? Er zit geen inherente beperking in PHP v.z.i.w.

https://niels.nu


Verwijderd

Topicstarter
Je krijgt gewoon wanneer je kiest voor het openen van de pdf dat hij het bestand download en de ene keer hangt hij op 7% en de andere keer op 25% dan weer op 77% en dan krijg je Kan xx.pdf niet downloaden.

Dit gebeurt alleen met de pdf documenten die groter zijn dan 500kb.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
En in de server logs ofzo staat nergens iets van een melding? Heb je error reporting aanstaan in je script?

https://niels.nu


Verwijderd

Topicstarter
Nee in de log zie je alleen dat hij een document probeert te openen met de grootte van het document maar die staat op 500kb.

Maar ik heb het al gevonden.
in de php.ini heb je de optie:

odbc.defaultlrl
; Handling of LONG fields. Returns number of bytes to variables. 0 means
; passthru.


Deze stond gelimiteerd op 500kb, heb dit nu vergroot en hij haalt alle pdf's nu op.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Oh, kijk even naar PDO. Ik neem aan dat die ID uit een querystring komt dus dan is er een enorm risico van SQL injection aanwezig. Het gebruik van de <database>_query functies is AFAIK deprecated.

https://niels.nu


  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22-11 18:42

Rannasha

Does not compute.

Is het sowieso niet handiger om de PDFs niet in de DB op te slaan, maar gewoon in het filesystem en dan een referentie naar het bestand in de DB zetten. Nu doet de DB dubbel dienst als geimproviseerd filesystem voor de PDFs.

|| Vierkant voor Wiskunde ||


  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Hydra schreef op dinsdag 02 juli 2013 @ 14:12:
Oh, kijk even naar PDO. Ik neem aan dat die ID uit een querystring komt dus dan is er een enorm risico van SQL injection aanwezig. Het gebruik van de <database>_query functies is AFAIK deprecated.
Als je je wil weren tegen SQL-injectie moet je ook prepared statements gebruiken, wat een mogelijkheid is van (o.a.) PDO. PDO alleen lost dat niet op.

Verwijderd

Topicstarter
Thanks guys ik zal ook even gaan kijken naar prepared statements om te gaan gebruiken.

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 17:24
Hydra schreef op dinsdag 02 juli 2013 @ 14:12:
Oh, kijk even naar PDO. Ik neem aan dat die ID uit een querystring komt dus dan is er een enorm risico van SQL injection aanwezig. Het gebruik van de <database>_query functies is AFAIK deprecated.
mysql_query is deprecated, niet de andere _query functies (pg_query is bijvoorbeeld een prima functie). Wil overigens niet zeggen dat het doorgaans niet veel beter is (er is ook geen excuus om het niet te gebruiken als je anders een query zou gaan opbouwen dmv string concats) om prepared statements te gebruiken icm PDO natuurlijk.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Rannasha schreef op dinsdag 02 juli 2013 @ 18:51:
Is het sowieso niet handiger om de PDFs niet in de DB op te slaan, maar gewoon in het filesystem en dan een referentie naar het bestand in de DB zetten. Nu doet de DB dubbel dienst als geimproviseerd filesystem voor de PDFs.
Maar je hebt wel voordelen als transactionele integriteit, controle op rechten en geintergreerde backup.

Als je MS SQL gebruikt loont het om eens te kijken naar MSDN: FILESTREAMStorage

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1