Probleme mit OCI und BLOB

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

  • Probleme mit OCI und BLOB

    Hallo zusammen ich habe ein kleines Problem mit OCI und BLOBs.

    In einer Datenbank werden Binärdaten in einem BLOB gespeichert und mit:

    PHP-Code:
        public function getDokumentDokumentID($dokID)
        {
            
    // Initialisierung der Ergebnisvariblen
            
    $dokument = array();
            
    // Erstellen einer Verbindung zur Datenbank
            
    $dbConn $this->dbConnect();
            
    // Aufbau des Query-Strings fuer die Tabelle WIKISEITEN_VERSION
            
    $dbQuery "SELECT A.DOKUMENT_ID AS DOKUMENT_ID,A.DOKUMENT_NAME AS DOKUMENT_NAME," .
                
    " A.DOKUMENT_TYP AS DOKUMENT_TYP, B.SEITENINHALT AS SEITENINHALT," .
                
    " C.PROJEKT_ID AS PROJEKT_ID".
                
    " FROM WIKISEITEN_DOKUMENT A,WIKISEITEN_VERSION B, PROJEKT_DOKUMENTATION C WHERE" .
                
    " A.DOKUMENT_ID=".$dokID." AND A.DOKUMENT_ID=B.DOKUMENT_ID".
                
    " AND A.DOKUMENT_ID=C.DOKUMENT_ID";
            
    // Ausfuehren des Query-Strings auf der Datenbank und Rueckgabe
            // des Ergebnisses
            
    $stmt=OCIParse($dbConn$dbQuery);
            
    OCIExecute($stmt);
            
    OCIFetch($stmt);
            
    $bdatalob=OCIResult($stmt"SEITENINHALT");
            
    $seiteninhalt=$bdatalob->load();
            
    $dID OCIResult($stmt"DOKUMENT_ID");
            
    $dName OCIResult($stmt"DOKUMENT_NAME");
            
    $dTyp OCIResult($stmt"DOKUMENT_TYP");
            
    $pID OCIResult($stmt"PROJEKT_ID");
            if (
    $pID)
            {
                
    $dokument['DOKUMENT_ID'] = $dID;
                
    $dokument['DOKUMENT_NAME'] = $dName;
                
    $dokument['DOKUMENT_TYP'] = $dTyp;
                
    $dokument['SEITENINHALT'] = $seiteninhalt;
                
    $dokument['PROJEKT_ID'] = $pID;    
            }
            
    // Beenden der Verbindung zur Datenbank
            
    $this->dbLogOff($dbConn);
            return 
    $dokument;    
        } 
    greife ich darauf zu. Sind die Daten textorientiert, habe ich kein Problem, aber Dateien wie GIFs oder JPGs werden nach dem Download größer. Ich habe schon die Abfrage auf Errormeldungen getestet und keine Erhalten.
    Die Definition fuer den Header sieht so aus:
    PHP-Code:
    if ($dokTyp == "doc")
    {
         
    $file_extension strtolower(substr(strrchr($dokName,"."),1));    
           switch( 
    $file_extension ) {
         case 
    "pdf"$ctype="application/pdf"; break;
         case 
    "exe"$ctype="application/octet-stream"; break;
         case 
    "zip"$ctype="application/zip"; break;
         case 
    "doc"$ctype="application/msword"; break;
         case 
    "xls"$ctype="application/vnd.ms-excel"; break;
         case 
    "ppt"$ctype="application/vnd.ms-powerpoint"; break;
         case 
    "gif"$ctype="image/gif"; break;
         case 
    "png"$ctype="image/png"; break;
         case 
    "jpeg":
         case 
    "jpg"$ctype="image/jpg"; break;
         case 
    "mp3"$ctype="audio/mpeg"; break;
         case 
    "wav"$ctype="audio/x-wav"; break;
         case 
    "mpeg":
         case 
    "mpg":
         case 
    "mpe"$ctype="video/mpeg"; break;
         case 
    "mov"$ctype="video/quicktime"; break;
         case 
    "avi"$ctype="video/x-msvideo"; break;

         
    //The following are for extensions that shouldn't be downloaded (sensitive stuff, like php files)
         
    case "php":
         case 
    "htm":
         case 
    "html":
         case 
    "txt": die("<b>Cannot be used for "$file_extension ." files!</b>"); break;

         default: 
    $ctype="application/force-download";
       }
      
    //Begin writing headers
       
    header("Pragma: public");
       
    header("Expires: 0");
       
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
       
    header("Cache-Control: public");
       
    header("Content-Description: File Transfer");
      
       
    //Use the switch-generated Content-Type
       
    header("Content-Type: $ctype");

       
    //Force the download
       
    $header="Content-Disposition: attachment; filename=".$dokName.";";
       
    header($header );
       
    header("Content-Transfer-Encoding: binary");
       echo 
    $blober;
       exit;

    Ich habe kontrolliert, ob die Daten richtig in der Datenbank landen und sie über TCL/TK abgefragt und dort lief es ohne Probleme. Die Größe hat gestimmt und die gespeicherte Datei war aufrufbar.

    Es sieht so aus, als würde die Datei durch den Download größer werden und hat im Fall von RTF-Dateien am Anfang eine Leerzeile.
    Jetzt weiss ich leider nicht mehr weiter. Vielleicht hat von Euch einer einen Tipp, was ich noch versuchen kann, oder woran es vielleicht liegt. Vielen Dank schon im Voraus für Tipps oder Hilfen.

    Viele Grüße,
    Stefan

  • #2
    Ich habe parallel eine Datei aus der Abfrage mittels

    PHP-Code:
        $handle fopen ("/tmp/".$dokName"w+");
        
    fwrite($handle,$blober);
        
    fclose($handle); 
    anlegen lassen. Diese Datei ist lesbar. Daher muss das Problem im Header liegen ... Aber ich weiss nicht wo.

    Viele Grüße,

    Stefan

    Kommentar


    • #3
      Ich habe mir einen Workaround gebastelt (ist nicht elegant, funktioniert aber). Das Problem liegt wirklich im Header und wie ich es direkt lösen kann, dass weiss ich nicht. Aber durch das Abspeichern der Binärdatei und das anschließende Umleiten auf eine weitere php-Seite, die nur die Ausgabe erledigt, funktioniert es auf einmal.

      Jetzt wäre ich tierisch froh, wenn mir jemand noch erklären könnte, warum mein erster Ansatz nicht geht.

      Viele Grüße,

      Stefan

      Kommentar


      • #4
        ich hatte das so:

        PHP-Code:
                $handle ocilogon($db_user,$db_pass,$db_sid);
                if(!
        $handle) {
                        
        db_error();
                        exit;
                }
                
        $query "    select blobcontent from blobtable";
                
        $query ociparse($handle,$query);
                
        ociexecute($query,OCI_DEFAULT);
                
        ocifetch($query);
                
        $c ociresult($query,ocicolumnname($query,1));
                
        $data $c->load();
                
        ocifreestatement($query);
                
        ocilogoff($handle);

                if      (       
        $ctype == 'message/rfc822' || $ctype == 'message/delivery-status' ||
                                
        $ctype == 'text/rfc822-headers' || $ctype == 'application/octet-stream'
                        
        )
                        
        $ctype "text/plain";


                
        ob_clean();
                
        header("Cache-control: private");
                
        header("Content-Type: $ctype");
                
        header("Content-Disposition: inline; filename=$fname");
                print 
        $data
        wichtig war der befehl ob_clean() ..ohne dem hats nicht funktioniert.
        Zuletzt geändert von unficyp; 05.04.2005, 15:21.

        Kommentar


        • #5
          Vielen Dank unficyp. Das hilft mir weiter. Ich werde es nachher gleich mal testen.

          Kommentar

          Lädt...
          X