mime-type Problem?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mime-type Problem?

    Hallo,
    ich habe beim Download von Dateien ein Problem.

    Ich habe Dateien in den Formaten rtf, doc, pdf, xls, ppt, zip, jpg, avi und mpeg. Ich speichere beim upload die Dateien auf der Festplatte und den Pfad in einer Datenbank. Wenn ich mir nun eine Datei herunterladen möchte klicke ich auf den entsprechenden Link und es erscheint das Downloadfenster.
    Wähle ich hier "speichern" speichere ich die Datei auf meiner Festplatte und kann sie mir anschließend ansehen.
    Gehe ich jedoch auf öffnen, funktioniert dies nur bei den Word-Dateien. Bei allen anderen Formaten bekomme ich Fehlermeldungen (c:\...\...xls wurde nicht gefunden).


    Mein Dowloadskript:

    PHP-Code:
    $res mysql_query("SELECT material.m_art, material.m_upload FROM material WHERE material.material_ID='$mID'",$db);
    $row mysql_fetch_array($res);

            if(
    strrchr($row[m_upload], '.')==".rtf"){
            
    $typ="rtf";
            }
            if(
    strrchr($row[m_upload], '.')==".doc"){
            
    $typ="doc";
            }
            if(
    strrchr($row[m_upload], '.')==".pdf"){
            
    $typ="pdf";
            }
            if(
    strrchr($row[m_upload], '.')==".xls"){
            
    $typ="xls";
            }
            if(
    strrchr($row[m_upload], '.')==".ppt"){
            
    $typ="ppt";
            }
            if(
    strrchr($row[m_upload], '.')==".zip"){
            
    $typ="zip";
            }
            if(
    strrchr($row[m_upload], '.')==".jpg"){
            
    $typ="jpg";
            }
            if(
    strrchr($row[m_upload], '.')==".avi"){
            
    $typ="avi";
            }
            if(
    strrchr($row[m_upload], '.')==".mpeg"){
            
    $typ="mpeg";
            }

    $dateiendung=$typ;
    $basedir "../../upload";
    $datei $row[m_upload];
    $dateiname sprintf("%s/%s"$basedir$datei);

    switch(
    $dateiendung)
    {
      case 
    'doc':
        
    $mime "application/msword";
      break;

      case 
    'jpg':
        
    $mime "image/jpeg";
      break;

      case 
    'xls':
        
    $mime "application/vnd.ms-excel";
      break;

      case 
    'pdf':
        
    $mime "application/pdf";
      break;

      case 
    'rtf':
        
    $mime "text/rtf";
      break;

      case 
    'fla':
        
    $mime "application/x-shockwave-flash";
      break;

      case 
    'ppt':
        
    $mime "application/vnd.ms-powerpoint";
      break;

      case 
    'zip':
        
    $mime "application/zip";
      break;

      case 
    'avi':
        
    $mime "video/x-msvideo";
      break;

      case 
    'mpeg':
        
    $mime "video/mpeg";
      break;

      case 
    'mp3':
        
    $mime "audio/x-mpeg-3";
      break;
    }
    header("Content-type: $mime");
    header("Content-Disposition: attachment; filename=\"$datei\"");
    readfile($dateiname); 
    Kann mir jemand erklären wo mein Fehler liegt?

    Ich verwende übrigens Windows XP und den Internet Explorer 6.0.

  • #2
    ich hab so ein ähnliches problem:
    ich speicher aber die komplette datei in der datenbank.
    funktioniert auch alles, außer mit dem IE: Wenn man die datei anklickt kommt ein Fenster. Hier steht dann zur Auswahl: Datei öffnen, oder Datei speichern. Datei speichern und anschließend manuell öffnen funktioniert. Datei öffnen geht jedoch nicht. Da kommt dann eine Fehlermeldung, dass die Datei nicht geöffnet werden konnte. Das komische ist aber, dass beides beim Firefox funktioniert. Ich bin grad dran, nach einer Lösung (oder zuerst mal nach dem Problem) zu suchen.
    Vielleicht hilft das hier weiter: http://www.php-resource.de/forum/sho...lorer+download
    Sollte ich mehr wissen, meld ich mich...

    Kommentar


    • #3
      Also ich muss da nachhaken, weil ich auch m forum nichts dazu finde.
      Gleich vorweg, ich glaube nicht mehr, dass es an den Headern liegt. Ich weiß allerdings auch nicht was sonst dran Schuld sein könnte.
      Das Problem ist oben beschrieben. Es werden beim Öffnen der Dateien auch die richtigen Anwendungen gestartet, erst diese melden dann: "Unbekanntes Dateiformat!".
      Darum glaube ich auch nicht, dass es etwas mit den Headern zu tun hat. Vielleicht liegt es irgendwie am Temp-Ordner des IE? Kann das sein?

      Kommentar


      • #4
        Selbes Problem

        Hallo zusammen

        Habe genau dasselbe Problem. Das Witzige ist, dass die Datei korrekt im Cache abgelegt wird aber direkt nach dem Download (bevor die Anwendung zum Anschauen der Datei) gestartet werden kann ist die Datei bereits wieder weg. Übrigens: Bei mir funktionierts wenn die Anwendung bereits gestartet ist. Beispiel: Ich habe ein Excel Sheet das ich nur öffnen möchte. Ist Excel bereits geöffnet so wird mir das Sheet auch angezeigt (Die Datei im Cache bleibt erhalten).

        Hoffe dass jemand bald eine Lösung für das Problem findet. Gruss
        Simel

        Kommentar


        • #5
          Ich vermute, dass der IE beim öffnen einer Datei vorher die filesize, bzw. die content-length haben will, damit ausreichend Speicher allokiert werden kann o.ä.

          Beim speichern auf der Platte wird blockweise weggeschrieben und die endgültige Dateigröße ist nicht notwendiger Weise erforderlich.

          Der Firefox handelt das afaik anders ab.

          aber, wie gesagt, ist nur 'ne Vermutung.

          Kommentar


          • #6
            Ich hab das jetzt bei mir nochmal ausprobiert:
            doc und xls Dateien gehen öffnen. Bei JPG oder PDF Dateien bekomme ich die Fehlermeldung: Datei nicht gefunden...
            Es ist aber egal, ob ich die Anwendung im vorhinein schon gestartet habe, oder nicht.

            Nur so nebenbei: wohin sollte der IE die Dateien speichern?

            Die Erklärung von ankh klingt plausibel... Das hieße aber auch, wenn ich im Header noch zusätzlich die Dateigröße angebe, dann sollte es klappen... Mal probieren..

            Kommentar


            • #7
              gefunden bei http://at.php.net/header
              com dot gmail at schaefer dot peter
              10-May-2005 08:02
              Regarding the IE pdf problem, doing the variation of not sending an
              Accept-Ranges: bytes
              header seems to make a difference. Strangely enough, some pdfs just work fine without these complications, so maybe changing that header just forced invalidation of the IE cache(I had emptied it, but who knows how IE really works).

              //header("Accept-Ranges: bytes");
              $filename= 'Labels'. date("ymdhis") . '.pdf';

              //FIX: IE6
              header('Content-type: application/pdf');
              header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
              header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
              header("Pragma: public");
              header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

              //header("Cache-Control: private");
              $pdf->stream( array('Content-Disposition'=>$filename) );

              This is a large pdf file.

              For a smaller pdf file, the straightforward thing worked too:

              header("Accept-Ranges: bytes");
              header("Cache-Control: private");
              $pdf->stream();

              Weird :-/
              Glaubt ihr kann das helfen?

              Ich glaub das klingt ganz vernünftig, und sehr nach unserem Problem (wenn es stimmt dann ist es also ein IE-Bug):
              james at charity dot org
              05-Apr-2005 06:15
              If you're creating a download page for Internet Explorer, the following code works:

              if(isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT'])) {
              // IE Bug in download name workaround
              ini_set( 'zlib.output_compression','Off' );
              }

              header('Content-type: ' . $file['type']);
              header("Pragma: public");
              header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
              header('Content-Disposition: attachment; filename="' . $file['filename'] . '"');
              print($file['data']);

              I will note that setting content length or size headers will cause IE to see the file being opened/saved as 0 bytes and will on occasion open the content of the file in the browser itself after the download fails.

              I also recieved file not found problems until I added the Pragma and Cache-Control headers.

              Yet another one of those "Thanks Bill" situations.

              --james

              Kommentar


              • #8
                Genau diese Zeile ist notwendig - und es klappt auch beim IE:
                Header("Cache-Control: must-revalidate, post-check=0, pre-check=0");

                Kommentar

                Lädt...
                X