[PHP] Haakjes [ ] bij downloaden bestand

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Beste iedereen,

Ik zocht net op dit forum titel dus denk die ga ik gebruiken, aangezien ik niks via Google vond en ook niks in het forum hier.

Ik heb een script gemaakt die PDF bestanden genereert (facturen in een leuke opmaak). Wanneer ik die vervolgens weer wil aanroepen via PHP, via <a href="../<naam_uit_database>.php">linkje</a>, dan roept hij dus een bestand aan vanaf de server (dus niet vanuit de database).. Het moet via een PHP bestand omdat ik de facturen opsla in een directory vóór de 'www' directory. Deze zijn dus niet zonder PHP bestand aan te roepen en dat wil ik ook niet..

Wanneer ik de download pop-up dan krijg, dan roept hij bijvoorbeeld een pdf bestand aan (zoals: F.05.0085.pdf).. Dat staat voor: Factuur 2005 nr. 0085. Het enige nadeel is, is dat wanneer ik 'openen' kies in plaats van 'opslaan', dat hij dan 'F[1].05.0085.pdf' probeert te openen, waarna hij een error geeft dat het bestand niet kan worden gevonden. Wel logisch, want F[1].05.0085.pdf staat niet op de server, maar F.05.0085.pdf (zonder [1]) wel.

Nu vroeg ik me af of dit ook op te lossen is en of iemand hier ervaring mee heeft. Ik vermoed dat het een browser probleem van I.E. is aangezien FireFox het wel goed doet. Het is geen cache probleem want bij nieuw aangemaakte facturen doet hij het ook.

Om mijn verhaal zo duidelijk mogelijk te maken, hier het script wat wordt gebruikt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
    $file = $type.".".$jaar.".".$id.".pdf";
    
    
    if(ob_get_contents())
        die('Some data has already been output, can\'t send PDF file');
    if(isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'],'MSIE'))
        header('Content-Type: application/force-download');
    else
        header('Content-Type: application/octet-stream');
    if(headers_sent())
        die('Some data has already been output to browser, can\'t send PDF file');
        
    header('Content-disposition: attachment; filename="'.$type.'.'.$jaar.'.'.$id.'.pdf"');
    include($dir.$file);
?>

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

IE ziet die punten waarschijnlijk als scheiding van bestandsnaam en extensie. Ik denk dat de enige oplossing zou zijn om die punten weg te halen of te vervangen door andere tekens.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Dan zet hij het erachter: F050084[1], of ervoor, denk ik. Ik ga het in ieder geval even proberen, kijken hoe het reageert.

En de factuur nummers moeten wegens al bestaande administratie heten zoals ze nu heten. Het liefst zou ik ook willen weten waardoor het komt dat dit gebeurt en het probleem niet vermijden.

In ieder geval bedankt voor je antwoord :)

[ Voor 12% gewijzigd door Zenda op 16-08-2005 23:54 ]

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • Vesta
  • Registratie: November 2004
  • Niet online
Het is inderdaad een bekend probleem:
To work around this bug, you must not allow files with two periods. You can also manually change the file name to remove the brackets.

Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Niet een oplossing voor je probleem. Maar je gaf aan dat je de PDF bestanden buiten de webroot laat. Ik neem aan dat je dit doet zodat niet iedereen de facturen van anderen in kan zien.

Maar als je dan makkelijk te raden namen voor je PDF bestanden gebruikt kan je ze alsnog vrij eenvoudig achterhalen.
(zoals: F.05.0085.pdf).. Dat staat voor: Factuur 2005 nr. 0085.
Misschien is het een idee om aan elke factuur ook (bv) een SessionID te koppelen en die te gebruiken om de bijbehorende PDF documenten op te vragen ipv de bestandsnaam zelf?

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 00:44

crisp

Devver

Pixelated

Je moet alle punten, behalve de laatste, vervangen door %2e - maar *alleen* voor IE, dus zoiets:
PHP:
1
2
3
4
if (strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE'))
{
    $file = preg_replace('/\./', '%2e', $file, substr_count($file, '.') - 1);
}


note dat HTTP_USER_AGENT sniffing nooit 100% accuraat is, maar helaas zijn er geen betere methoden, hooguit uitgebreidere die preciezer zijn.

[ Voor 7% gewijzigd door crisp op 17-08-2005 00:07 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
tnx voor jullie antwoorden.. heb er weer wat van geleerd..

Ik zal even toelichting geven over het systeem.. Het is een aftreksel van een CRM systeem wat we gaan gebruiken hier, PHP is misschien niet de beste taal om dit in te doen maar het werkt tot zover prima..

Het is dus niet voor 'factuur online' o.i.d. dus klanten krijgen hier verder niets mee te maken. Wanneer we factuur online gaan toepassen dan hou ik deze opmerking zeker in gedachten, klinkt goed om een sessid te koppelen aan een factuur..

Nogmaals bedankt!

Zenda likes some milk every now and then..


Acties:
  • 0 Henk 'm!

  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
whaa crisp!! 't works mate :) dank je wel!! alle punten met %2e vervangen behalve de laatste (.pdf) en nu doet hij het goed.. erg bedankt!

[ Voor 55% gewijzigd door Zenda op 17-08-2005 00:08 ]

Zenda likes some milk every now and then..

Pagina: 1