Announcement

Collapse
No announcement yet.

PHP +SQL Server (ODBC) + BLOB speichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PHP +SQL Server (ODBC) + BLOB speichern

    EDIT: Erledigt, kann zu!

    Hallo,

    habe leider nichts gefunden was mit MS SQL Server zu tun hat, nur mit MySQL. Als Datenbank verwende ich eine MS SQL Server 2008 über ODBC mit PHP

    Ich möchte gerne eine Datei (zum Beispiel ein JPG) in ein IMAGE-Feld schreiben. Ob das nun sinn macht oder nicht, sei erstmal irrelevant. Bisher gehe ich folgendermaßen vor:

    Ich habe in HTML ein input vom Type "file". Beim submitten der form hole ich mir erst mal die infos der datei:

    PHP Code:
    $tempname     $_FILES['datei']['tmp_name']; 
    $name         $_FILES['datei']['name'];
    $type         $_FILES['datei']['type']; 
    $size        $_FILES['datei']['size']; 
    Anhand dieser Infos überprüfe ich erst mal ob sie zu groß ist und ob der Dateityp korrekt ist. Wenn das also alles erfolgreich ist lese ich den Inhalt der Datei aus. Die funktion asc2bin wandelt die Zeichen in binären code (0 und 1) um:

    PHP Code:
    $fp fopen($tempname"rb");
    $blobdata asc2bin(fread($fpfilesize($tempname)));
    fclose($fp); 
    Nun habe ich in $blobdata einen string von 0 und 1. Ich hoffe bis hierhin habe ich alles richtig gemacht. In die Datenbank will ich jetzt diesen string in die IMAGE-Spalte schreiben und in eine andere Spalte den dateinamen (den ich bereits habe). Mit dem Dateinamen gibt das kein Problem, mit dem IMAGE schon. Entweder gibt es einen Fehler 37000 oder es wird nichts in die IMAGE-Spalte eingetragen. (Beim Auslesen speichert er zwar eine Datei mit dem Dateinamen, diese ist allerdings 0kb groß und leer).

    Das SQL sieht so aus:

    PHP Code:
    function anfrage_insert3 ($dateiid$devid$dateiname$datei) {
        
    $c $_SESSION['connection'];
        
    $s "INSERT INTO DATEI (DATEIID, DEVELOPMENTID, DATEINAME, DATEI) VALUES ($dateiid$devid, '$dateiname', '$datei')";
        
    send_sql($c$s);
        
    commit($c);
      } 
    Ich bin jetzt leider überfragt.
    Zuletzt editiert von acillus; 05.01.2010, 13:34.

  • #2
    Ich habe in HTML ein input vom Type "file". Beim submitten der form hole ich mir erst mal die infos der datei:
    Dein o.a. Vorgehen setzt voraus, dass deine Anwendung nur mit Dateien arbeitet, die auf dem lokalen Server liegen

    Ein Zugriff auf Dateien eines Clients über fopen usw. ist im Internet nicht möglich.

    Hier ist eine Anleitung

    http://www.tutorials.de/forum/php-tu...-formular.html
    Christian

    Comment


    • #3
      Originally posted by Christian Marquardt View Post
      Dein o.a. Vorgehen setzt voraus, dass deine Anwendung nur mit Dateien arbeitet, die auf dem lokalen Server liegen

      Ein Zugriff auf Dateien eines Clients über fopen usw. ist im Internet nicht möglich.

      Hier ist eine Anleitung

      http://www.tutorials.de/forum/php-tu...-formular.html
      Vielen Dank für die Anleitung, ich habe nun das copy() eingebaut und erfolgreich die Datei auf den server hochgeladen:

      PHP Code:
      copy($tempname"uploads/".$dateiname); 
      Nun bleibt $blobdata nach diesem code allerdings leer:

      PHP Code:
      $fp fopen("uploads/".$dateiname"rb");
      $blobdata asc2bin(fread($fpfilesize($dateiname)));
      fclose($fp);        
                              
      echo 
      $blobdata

      Comment


      • #4
        Hallo,
        Originally posted by acillus View Post
        ...Nun bleibt $blobdata nach diesem code allerdings leer:

        PHP Code:
        $fp fopen("uploads/".$dateiname"rb");
        $blobdata asc2bin(fread($fpfilesize($dateiname)));
        fclose($fp);        
                                
        echo 
        $blobdata
        Das liegt daran, dass filesize($dateiname) ein FALSE liefert, welches als 0 interpretiert wird. Es werden also 0 Byte Daten gelesen. Die Datei $dateiname existiert nicht. Es müßte filesize('uploads/'.$dateiname) heißen.

        Gruß Falk

        P.S.: Die Verwendung von doppelten Hochkomma sollte man nicht willkürlich wählen. Aus (wenn auch geringen) Performancegründen sollte man entweder "uploads/$dateiname" oder 'uploads/'.$dateiname schreiben.
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Originally posted by Falk Prüfer View Post
          Hallo,


          Das liegt daran, dass filesize($dateiname) ein FALSE liefert, welches als 0 interpretiert wird. Es werden also 0 Byte Daten gelesen. Die Datei $dateiname existiert nicht. Es müßte filesize('uploads/'.$dateiname) heißen.

          Gruß Falk

          P.S.: Die Verwendung von doppelten Hochkomma sollte man nicht willkürlich wählen. Aus (wenn auch geringen) Performancegründen sollte man entweder "uploads/$dateiname" oder 'uploads/'.$dateiname schreiben.
          Vielen Dank für die Info, hab ich das doch glatt übersehen.

          Die Behebung des Fehlers hat nun zur Folge, das ich die Datei richtig auslesen kann. Jedoch bleibt der Fehler bestehen: Beim Auslesen speichert er zwar eine Datei mit dem Dateinamen, diese ist allerdings 0kb groß und leer.

          Hier nochmal der vollständige Code:

          PHP Code:
          $tempname1     $_FILES['datei1']['tmp_name']; 
          $name1         $_FILES['datei1']['name'];
          $type1         $_FILES['datei1']['type']; 
          $size1         $_FILES['datei1']['size']; 

          if(
          $type1 != "image/gif" && $type1 != "image/jpeg" && strlen($name1) > 0) { 
              
          $err[] = "Nur gif und jpeg Dateien dürfen hochgeladen werden."

          if(
          $size1 "300000") { 
              
          $err[] = "Die Datei 1 ist zu gross!<br>Die maximale Dateigrosse beträgt 300 KB."
          }          

          if(empty(
          $err)) { 
              if(
          strlen($name1) > 0) {
                  
          #neue Dateiid
                  
          $dateiid f_getnewdateiid();
                  
          #Dateinamen bilden
                  
          $dateiname f_getdateiname($name1);
                  
                  
          #Datei hochladen
                  
          copy($tempname1'uploads/'.$dateiname);
                          
                  
          #Datei öffnen
                  
          $fp fopen('uploads/'.$dateiname"rb");
                  
          #ASCII auslesen und Datei schließen
                  
          $blobdata addslashes(fread($fpfilesize('uploads/'.$dateiname)));
                  
          close($fp);        
                          
                  
          #ASCII in Binary wandeln        
                  
          $blobdata asc2bin($blobdata);
                                  
                  
          #Datensatz in Datenbank anlegen (funktioniert). Blob ist hier noch NULL
                  
          anfrage_insert3($dateiid$devid$dateiname);
                  
          #Datensatz updaten (keine Fehlermeldung, beim Auslesen ist jedoch nichts drin)
                  
          anfrage_update1($devid$blobdata);
              }

          EDIT:

          Ich glaube das umwandeln in Binary ist nicht korrekt. Hier mal ein Vergleich der Datei:

          Original: ÿØÿà JFIF  ` `
          PHP: ÿØÿàJFIF``

          Nun, auf den ersten blick sieht es gleich aus, aber PHP löscht die Leerzeichen! Mit der funktion addslashes sieht das so aus: ÿØÿà\0JFIF\0\0`\0`\0\0

          Leider bekomme ich beim schreiben des Strings in die Datenbank dann den net ten Fehler 37000
          Zuletzt editiert von acillus; 04.01.2010, 12:49.

          Comment


          • #6
            Habe mich entschieden die Daten lieber auf den ftp zu legen und nur die Pfade in der DB zu speichern. Funktioniert einwandfrei.

            Comment

            Working...
            X