[PHP] Bestand openen in Internet Explorer (Headers probleem)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
Ik ben nog steeds voor mijn stage bezig met het opzetten van een intranet voor een bedrijf. Nu heb ik van www.olate.co.uk een script gedownload wat functioneerd als file-manager. Perfect script, templates aangepast...
Nu wilde ik een view.php erbij doen zodat de bestanden niet gedownload kunnen worden maar echt 'gestreamed' worden in Internet Explorer..

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    header("Cache-Control: ");    
    header("Pragma: ");     
    if($ext == 'pdf') {
    header("Content-Type: application/pdf"); 
    }
    if($ext == 'doc') {
    header("Content-Type: application/word"); 
    }
    if($ext == 'xls') {
    header("Content-Type: application/excel"); 
    }
    if($ext == 'vsd') {
    header("Content-Type: application/visio"); 
    }
    if($ext == 'ppt') {
    header("Content-Type: application/powerpoint"); 
    }
    if($ext == 'mdb') {
    header("Content-Type: application/access"); 
    }
    if($ext == 'dot') {
    header("Content-Type: application/word"); 
    }   
    else {
    header("Content-Type: application/octet-stream");   
    }   
header("Content-Disposition: inline;filename=\"$file_name\"");
header("Content-length: \"$size\"");
header("Content-Description: Euler Hermes Intranet");


Hiervoor komt nog wat code waarmee het bestand word geselecteerd maar dit werkt dus hoef ik denk ik niet te posten. De $ext word tijdens het uploaden van het bestand al opgeslagen in de database zodat er tijdens het openen van ieder bestand niet gekeken hoeft te worden naar de extensie.
De extensie word dus goed doorgegeven maar ik kan geen bestanden streamen.
PDFjes worden niet geladen maar ik krijg een icoontje in de linkerhoek. Het icoontje ziet er zo uit:
Een wit a4-tje met een rode kubus, groen cirkel en blauwe driehoek. Volgens mij het jpeg icoontje maar dit weet ik niet zeker. Terwijl hij toch echt Acrobat moet laden gebeurd er niks.

Hetzelfde geld voor Word templates (.dot) enkel hier word wel Word geopend maar er verschijnt een leeg document. Ook word er gevraagd of het bestand opgeslagen / gewijzigd moet worden en als ik hem opsla is het een bestand van 0 Kb.

Heeft iemand dit probleem meer gehad? Iemand oplossing?

Alvast bedankt _/-\o_

[Ps. Ik gebruikt Windows 2000 Server / Internet Explorer 6 SP 1]

Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Laat eens wat meer code zien, headers zien er goed uit, de kans is groter dat je wat fout doet verder in je script (waar je het file naar de browser stuurt bijv.).

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Volgens mij vergeet je nog de content mee te sturen, ik zie namelijk alleen de headers weggeschreven worden en niet de inhoud. :/

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

  • Wacky
  • Registratie: Januari 2000
  • Laatst online: 05-09 21:19

Wacky

Dr. Lektroluv \o/

Banpei schreef op maandag 15 november 2004 @ 16:40:
Volgens mij vergeet je nog de content mee te sturen, ik zie namelijk alleen de headers weggeschreven worden en niet de inhoud. :/
En waar haal je $ext en $file_name vandaan :?

[ Voor 1% gewijzigd door Wacky op 15-11-2004 17:01 . Reden: typo ]

Nu ook met Flickr account


Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
$ext en $file_name komen uit de database

Morgen zal ik wat meer code posten, ben nu namelijk thuis..

Ik heb voor de geposte code wat stukken weggehaald, maar wat je hier op het einde ziet (de headers) is ook in het script het einde.

fpassthru heb ik ook gebruikt maar daarna weer weggehaald.

Dus fpassthru gebruiken of nog andere suggesties ??

Acties:
  • 0 Henk 'm!

  • nxt
  • Registratie: November 2001
  • Laatst online: 24-08 15:34

nxt

je stuurt meerdere Content-Type headers
kijk eens of het helpt om else if te gebruiken

voorbeeldje:
PHP:
1
2
3
4
5
6
7
    if($ext == 'mdb') { 
      header("Content-Type: application/access");  
    } else if($ext == 'dot') { 
      header("Content-Type: application/word");  
    } else { 
      header("Content-Type: application/octet-stream");      
    }

in de door jouw geposte code zal namenlijk behalve in 't geval van .dot altijd de application/octet-stream verstuurd worden na de goede header

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

nxt schreef op maandag 15 november 2004 @ 18:11:
je stuurt meerdere Content-Type headers
kijk eens of het helpt om else if te gebruiken

voorbeeldje:
PHP:
1
2
3
4
5
6
7
    if($ext == 'mdb') { 
      header("Content-Type: application/access");  
    } else if($ext == 'dot') { 
      header("Content-Type: application/word");  
    } else { 
      header("Content-Type: application/octet-stream");      
    }

in de door jouw geposte code zal namenlijk behalve in 't geval van .dot altijd de application/octet-stream verstuurd worden na de goede header
in dit geval is een switch mooier imo

PHP:
1
2
3
4
5
6
7
8
9
10
switch($ext){
  case 'mdb':
    header('Content-Type: application/access');
    break;
  case 'doc':
    header('Content-Type: application/word');
    break;
  default:
    header('Content-Type: application/octet-stream');
}

[ Voor 8% gewijzigd door Erkens op 15-11-2004 18:17 ]


Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
Hieronder alle code uit view.php.
Ik heb inmiddels de switch erin geplakt maar het werkt nog steeds niet. Alhoewel ik geen plaatje in de linkerhoek bij een pdf krijg.

Iemand nog een idee ?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
include('../inc/db.php');
    $result = mysql_query("SELECT m.id, m.file_id, f.size, f.rating_votes, f.rating_value, f.downloads FROM downloads_mirrors as m, downloads_files as f WHERE f.id = '$id' LIMIT 1");
    $row = mysql_fetch_array($result);
    $url = "http://localhost/files/";
    $file_name = $row['rating_value'];
    $ext = $row['rating_votes'];
    $file_name = urlencode($file_name);
    $size = $row['size'];
    // Verhoog downloads met 1
    $dl = $row['downloads']; 
    $dl++; 
    $q = mysql_query("UPDATE downloads_files SET downloads = \"$dl\" WHERE id = $id");
    // Einde
    $url = "$url " . $file_name . " ";
    $fp = fopen($name, 'rb');
    header("Cache-Control: ");    
    header("Pragma: ");  
    switch($ext){ 
      case 'pdf': 
        header('Content-Type: application/pdf'); 
        break; 
      case 'doc': 
        header('Content-Type: application/word'); 
        break; 
      case 'xls': 
        header('Content-Type: application/excel'); 
        break; 
      case 'vsd': 
        header('Content-Type: application/visio'); 
        break; 
      case 'ppt': 
        header('Content-Type: application/powerpoint'); 
        break; 
      case 'mdb': 
        header('Content-Type: application/access'); 
        break;         
      case 'dot': 
        header('Content-Type: application/dot'); 
        break;  
      default: 
        header('Content-Type: application/octet-stream'); 
    } 
header("Content-Disposition: inline;filename=\"$file_name\"");
header("Content-length: \"$size\"");
header("Content-Description: Euler Hermes Intranet");
@fpassthru($fp);
exit;

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

haal die @ eens weg, en kijk of je een foutmelding krijgt

Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
Idd, die @ stond er in omdat ik dat zag staan in een topic van Pelle en dat ging ook over headers. Maar idd als ik het weghaald gebeurd er niks, geen foutmelding... niks...

Een dot is nog steeds leeg als ik hem open.

Ps. De bestanden die geupload zijn zijn wel goed

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Weet je zeker dat je geen foutmelding krijgt?
zet het content-type even tijdelijk op text/html en bekijk de output

[ Voor 4% gewijzigd door Erkens op 16-11-2004 09:25 ]


Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
Ik heb hem op text/html gezet maar ik krijg ook geen output.
Net btw wel een foutmelding toen ik die header met size weghaalde.
PHP:
1
    $fp = fopen($url, 'rb');
moest het zijn.

Maar dit werkt ook niet...

edit:

Bij eigenschappen van de pagina staat ook 0 bytes...

[ Voor 18% gewijzigd door RMX op 16-11-2004 09:31 ]


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

ehm, ik zie dit nu pas:
PHP:
1
$url = "$url " . $file_name . " ";


waarom al die quotes? en waarom die spatie achter de filename?

PHP:
1
2
3
4
5
$url .= $file_name;

// of als je geen .= wilt gebruiken

$url = $url . $file_name;

Acties:
  • 0 Henk 'm!

  • RwD
  • Registratie: Oktober 2000
  • Niet online

RwD

kloonikoon

Erkens schreef op dinsdag 16 november 2004 @ 09:25:
Weet je zeker dat je geen foutmelding krijgt?
zet het content-type even tijdelijk op text/html en bekijk de output
en als dat niet werkt, moet je alles commentaar maken, kijken of je een fout krijgt, dan de output doen, kijken of het werkt, zo ja: weer een regel toevoegen. Totdat je de regel hebt gevonden waarmee het fout gaat...

Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
Erkens schreef op dinsdag 16 november 2004 @ 09:34:
ehm, ik zie dit nu pas:
PHP:
1
$url = "$url " . $file_name . " ";


waarom al die quotes? en waarom die spatie achter de filename?

PHP:
1
2
3
4
5
$url .= $file_name;

// of als je geen .= wilt gebruiken

$url = $url . $file_name;
Hmm inderdaad, het bestand word wel aangeboden maar misschien dat ie daarom maar 0 bytes stuurt.
Ik ga het even aanpassen..
En waarom al die quotes?
Beetje VB gewend denk ik...

edit:

<br />
<b>Warning</b>: fopen(http://localhost/files/IT+NL+System+Access+Request+Form.dot): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found
in <b>d:\appserv\www\personeel\file\view.php</b> on line <b>19</b><br />
<br />
<b>Warning</b>: fpassthru(): supplied argument is not a valid stream resource in <b>d:\appserv\www\personeel\file\view.php</b> on line <b>50</b><br />
Als ik de header met $size weg haal krijg ik deze foutmelding..
Ik ga weer ff verder stoeien..

In de tussentijd iedereen bedankt voor zijn reactie!

[ Voor 37% gewijzigd door RMX op 16-11-2004 09:53 ]


Acties:
  • 0 Henk 'm!

Verwijderd

En zet voor de zekerheid even error_reporting(E_ALL); zodat je zeker weten alle errors te zien krijgt.

[edit] tussen de User Notes op PHP.net bij header(); staat:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*In IE, you must allow inline PDFs to be cached or they will not load. 
Errors like:

File type: Adobe Acrobat Control for ActiveX
and
Internet Explorer was unable to open this site

Are caused by headers like: */

header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache");

// Use the following and generate a unquie filename:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate");

$pdf_file = $filename . date("ymdhis") . ".pdf";

header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"$pdf_file\"");
readfile("original.pdf");


Dus op mij komen die lege headers bij jou wat verdacht over...:
PHP:
1
2
header("Cache-Control: ");    
header("Pragma: ");

[ Voor 130% gewijzigd door Verwijderd op 16-11-2004 09:57 ]


Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
Error_reporting staat aan...
* RMX gaat ff verder

Die verdachte headers heb ik ook van php.net gehaald maar ik zal het eens proberen.

Verder zat ik zelf nog een beetje te klooien en kwam erachter dat als ik de header van size weghaal dat er nu wel het bestand geladen word.
Alleen in binary dus allemaal vreemde tekens in IE.
code:
1
ÐÏࡱá>þÿ &#8225;&#8240;þÿÿÿ&#8218;


Kheb deze regel vervangen:
PHP:
1
2
$file_name = urlencode($file_name); //Deze leverde problemen op
$file_name = str_replace(' ', '%20',$file_name);


Edit:

Ik dacht dat ik het werkend had totdat ik de pc opnieuw opstartte voor de zekerheid. En ja hoor het werkte niet meer...

Toen // voor de regel met header size gezet en de pdf laad nu wel.

Ik ga nog ff verder frotten maar voor de tussentijd bedankt Resistanz, na dat ik de eerste paar regels van jou code toevoegde:
PHP:
1
2
3
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: must-revalidate");

werkte het ineens. Ik heb dus de laatste regels niet toegevoegd...

Voor de mensen vanaf de zoekmachine hier de volledige code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?
error_reporting(E_ALL);
if(isset($id))
{
    include('../inc/db.php');
    $result = mysql_query("SELECT m.id, m.file_id, f.size, f.rating_votes, f.rating_value, f.downloads FROM downloads_mirrors as m, downloads_files as f WHERE f.id = '$id' LIMIT 1");
    $row = mysql_fetch_array($result);
    $url = "http://localhost/files/";
    $file_name = $row['rating_value'];
    $ext = $row['rating_votes'];
    //$file_name = urlencode($file_name);
    $file_name = str_replace(' ', '%20',$file_name);
    $size = $row['size'];
    // Verhoog downloads met 1
    $dl = $row['downloads']; 
    $dl++; 
    $q = mysql_query("UPDATE downloads_files SET downloads = \"$dl\" WHERE id = $id");
    // Einde
    $url = $url . $file_name;   
    //$url = "$url " . $file_name . " ";
    $fp = fopen($url, 'rb');
    switch($ext){ 
      case 'pdf': 
        header('Content-Type: application/pdf'); 
        break; 
      case 'doc': 
        header('Content-Type: application/word'); 
        break; 
      case 'xls': 
        header('Content-Type: application/excel'); 
        break; 
      case 'vsd': 
        header('Content-Type: application/visio'); 
        break; 
      case 'ppt': 
        header('Content-Type: application/powerpoint'); 
        break; 
      case 'mdb': 
        header('Content-Type: application/access'); 
        break;         
      case 'dot': 
        header('Content-Type: application/word'); 
        break;  
      default: 
        header('Content-Type: application/octet-stream'); 
    } 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: must-revalidate");   
header("Content-Disposition: inline; filename=\"$file_name\"");
//header("Content-length: \"$size\"");
header("Content-Description: Euler Hermes Intranet");
fpassthru($fp);
exit;
}
else
{
print "Geen bestand opgegeven";
}
?>

[ Voor 153% gewijzigd door RMX op 16-11-2004 10:19 ]


Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
Ik zit nog met een probleem:

PDFjes worden geladen zonder iets te vragen maar bij een .dot word gevraagd of je hem wilt openen of opslaan.
Als ik hem open word alles netjes in IE geladen.
Maar een eis van het intranet is dat geen bestanden opgeslagen mogen worden.
Nu is het met een .dot geen probleem maar onder het motto: "Moet kunnen toch?"...

Iemand een idee welke headers nodig zijn?
Thnx

Acties:
  • 0 Henk 'm!

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 20:37
De Content-Type is niet goed dit moet zijn bij word:
application/msword
Excel:
application/vnd.ms-excel

en de rest kun je op internet vinden

[ Voor 46% gewijzigd door Eskimootje op 16-11-2004 10:31 ]


Acties:
  • 0 Henk 'm!

  • RMX
  • Registratie: Augustus 2000
  • Laatst online: 18-09 21:56
Eskimo bedankt! _/-\o_
edit:

Het werkt nog niet maar ik heb het in ieder geval aangepast dus tis niet voor niks

[ Voor 69% gewijzigd door RMX op 16-11-2004 11:23 ]


Acties:
  • 0 Henk 'm!

  • Eskimootje
  • Registratie: Maart 2002
  • Laatst online: 20:37
Die rechten worden door IE bepaald, dat kun je niet zelf doen helaas.
Pagina: 1