Avatar billede cht Nybegynder
21. marts 2002 - 20:56 Der er 5 kommentarer og
1 løsning

Tilføje binære (binary) data til MySQL database

Er der nogen der har koden til at tilføje binære (binary) data til MySQL database, nedenstående kan bruges til Access (mdb) database, men det virker altså ikke til MySQL:

Jeg betaler gerne, hvis der er en der kan komme med en løsning!

<%
        Const adTypeBinary = 1
        Set objStream = Server.CreateObject("ADODB.Stream")
        objStream.Open
        objStream.Type = adTypeBinary
        objStream.LoadFromFile Server.Mappath("fil.gif")

            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open "binarydb", strConn, 2, 2
            rs.AddNew
                rs("writer") = session("navn")
                rs("filedata").AppendChunk objStream.Read
            rs.Update
           
            rs.Close
            Set rs = Nothing
        objStream.Close
        Set objStream = Nothing
%>


Jeg har prøvet med nedenstående og det bliver også tilføjet til min MySQL database, men jeg kan ikke få udskrivet det rigtigt fra databasen:


<%
  SQLserveradr     =    "localhost"
  SQLdatabase     =    "test"
  SQLlogin     =    "admin"
  SQLpassword     =    "admin"

  strConn = "driver={MySql};server="& SQLserveradr &";database="& SQLdatabase & ";uid="& SQLlogin &";pwd="& SQLpassword & ";OPTION=16386"

'String to byte string conversion
Function getByteString(StringStr)
For i = 1 to Len(StringStr)
    char = Mid(StringStr,i,1)
    getByteString = getByteString & chrB(AscB(char))
Next
End Function

'Byte string to string conversion
Function getString(StringBin)
getString =""
For intCount = 1 to LenB(StringBin)
    getString = getString & chr(AscB(MidB(StringBin,intCount,1)))
Next
End Function

Function StringToBinary(S)
    Dim i, ByteArray
    For i=1 To Len(S)
        ByteArray = ByteArray & ChrB(Asc(Mid(S,i,1)))
    Next
    StringToBinary = ByteArray
End Function


        Const adTypeBinary = 1
        Set objStream = Server.CreateObject("ADODB.Stream")
        objStream.Open
        objStream.Type = adTypeBinary
        objStream.LoadFromFile Server.Mappath("fil.gif")


    Function Validate(String)
        if String = "" then
            Validate = " "
        else
            Validate = Replace(Replace(String,"'","''"),Chr(0),"")
        end if
    End Function

    Function ValidateNumber(String)
        if not IsNumeric(String) or String = "" then
            ValidateNumber = 0
        else
            ValidateNumber = String
        end if
    End Function



    SQL = "INSERT INTO binarydb (" &_

        "filedata" &_

        ") VALUES (" &_

    "'"     & Validate(getString(objStream.Read)) & "'" &_
    ")"

    Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open strConn

    Conn.Execute SQL

    Conn.Close
    Set Conn = Nothing


        objStream.Close
        Set objStream = Nothing
%>


Jeg bruger følgende til at udskrive fra databasen, men det bliver som sagt ikke udskrevet rigtigt:

<%
    Set objRS = Server.CreateObject("ADODB.Recordset")
    strQ = "SELECT * FROM binarydb order by id desc"
    objRS.Open strQ, strConn, 2, 3, &H0001

    if not objRS.EOF then
        response.binaryWrite getByteString(getString(objRS("filedata")))
    else
        response.redirect "1x1.gif"
    end if

    objRS.Close
    Set objRS = Nothing

%>
Avatar billede excession Nybegynder
22. marts 2002 - 00:38 #1
er der ikke allerede en VBscript funktion der hedder getString?
Avatar billede coltau Juniormester
23. marts 2002 - 10:47 #2
Jeg har arbejdet lidt med dit problem - bl.a. med ovenstående kode - men jeg har desværre ikke ADODB.Stream på min lokale PWS. Jeg har så prøvet med alm. TextStream men den gemmer selvfølgelig ikke hele billedet.

Jeg har god erfaring med upload af billeder til databaser - men i dit eksempel er billedet jo allerede uploaded.

Hvis du har gemt billedet i MySql med den nye kode - men ikke kan vise billedet kan du prøve med følgende kode til udtrækket:

if not objRS.EOF then
'      response.binaryWrite getByteString(getString(objRS("filedata")))
      len = objRS("filedata").ActualSize
      if len > 0 then
        pic = objRS("filedata").GetChunk(len)
        Response.BinaryWrite pic
      end if
    else
        response.redirect "1x1.gif"
    end if

Hvis det ikke virker er det måske fordi at billedet ikke er gemt korrekt i feltet, filedata.

Jeg vil også mene at din første kode er bedre til at gemme billedet end den nye kode du har fundet. Den nye kode gemmer binære data via en SQL-sætning - det går aldrig godt.

  rs.AddNew
  rs("writer") = session("navn")
  rs("filedata").AppendChunk objStream.Read
  rs.Update
           
Ovenstående kode skal da virke selvom du siger den ikke gør. Hvis koden virker kan du prøve at tilføje et felt i databasen og gør således:

  rs.AddNew
  rs("writer") = session("navn")
  rs("filedata").AppendChunk objStream.Read
  rs("len") = objRS("filedata").ActualSize
  rs.Update

Med det felt kan du jo kontrollere at det korrekte antal bytes virkelig er gemt. Når det er på plads er der jo kun udtrækket tilbage.
Avatar billede cht Nybegynder
23. marts 2002 - 22:29 #3
Tak for dit svar, men det ser desværre ikke ud til at virke.

Hvis jeg prøver med nedenstående kode, så kommer den med denne fejl:


Microsoft OLE DB Provider for ODBC Drivers fejl '80040e21'

ODBC driver does not support the requested properties.

/mysql/add_file_to_db.asp, linje 16


og i linie 16 står der:

rs.AddNew


<%
  SQLserveradr     =    "localhost"
  SQLdatabase     =    "test"
  SQLlogin     =    "admin"
  SQLpassword     =    "admin"

  strConn = "driver={MySql};server="& SQLserveradr &";database="& SQLdatabase & ";uid="& SQLlogin &";pwd="& SQLpassword & ";OPTION=16386"

        Const adTypeBinary = 1
        Set objStream = Server.CreateObject("ADODB.Stream")
        objStream.Open
        objStream.Type = adTypeBinary
        objStream.LoadFromFile Server.Mappath("fil.gif")

            Set rs = Server.CreateObject("ADODB.Recordset")
            rs.Open "binarydb", strConn, 2, 2
            rs.AddNew
                rs("writer") = "ddd"
                rs("filedata").AppendChunk objStream.Read
            rs.Update
           
            rs.Close
            Set rs = Nothing

        objStream.Close
        Set objStream = Nothing
%>


Prøver jeg med nedenstående til at vise billedet, så får jeg følgende fejlmeddelelse:

ADODB.Field fejl '800a0c93'

Operation is not allowed in this context.

/mysql/showimage.asp, linje 48



Hvor der i linie 48 står følgende:

pic = objRS("filedata").GetChunk(data_lenght)


<%
    if not objRS.EOF then

      data_lenght = objRS("filedata").ActualSize
      if data_lenght > 0 then
            pic = objRS("filedata").GetChunk(data_lenght)
            Response.BinaryWrite pic
      end if
    else
        response.redirect "1x1.gif"
    end if
%>


Jeg tror faktisk at problemet er at den ikke gemmer hele filen i databasen, hvis jeg prøver nedenstående, så skriver den kun at længden er 10 og den skulle vel have været 85, når det er filens størrelse.


<%
        response.Write len((objRS("filedata")))


%>
Avatar billede coltau Juniormester
24. marts 2002 - 13:07 #4
Din første fejl "ODBC driver does not support the requested properties" tyder på at ODBC-driveren ikke understøtter andet end SQL. Altså den understøtter ikke kommandoer som: RS.RecordCount RS.AbsolutePage mv.
Det er noget l ...
Jeg har selv lige installeret en MySQL lokalt på min PC og har endnu ikke fået den til at understøtte ovennævnte kommandoer - men alle kommandoerne virker med Access.

Du kan dog prøve at åbne recordsettet på nedenstående måde i stedet for. Den anvender jeg når jeg uploader billeder til database. (Access)

  Set RS = Server.CreateObject("ADODB.RecordSet")
  RS.CursorLocation = 2 ' adUseServer
  RS.CursorType = ' 0 adOpenForwardOnly
  RS.LockType = 3 ' adLockOptimistic
  RS.Open "select * from binarydb", objConn, , , &H0001 ' adCmdText

i stedet for denne linie:
rs.Open "binarydb", strConn, 2, 2

Hvis det virker - hvad jeg tvivler på - så kan denne metode sikkert også løse problem nr. 2.

Jeg tror desværre at problemet ligger i ODBC-driveren. Den understøtter ikke umiddelbart alle kommandoer lokalt - det vil jeg undersøge nærmere for jeg ved at den kan.
Avatar billede cht Nybegynder
26. marts 2002 - 20:57 #5
Det virker desværre heller ikke... det byder egentlig ikke noget hvordan filerne kommer ind i MySQL databasen, bare de kommer der ind på en eller anden måde, enten vha. FileSystemObject, upload, ADODB.Stream eller hvad man nu kan finde på...
Avatar billede card Nybegynder
05. februar 2005 - 12:41 #6
Hej cht.

Upload er ikke noget problem.

Kig på mit spm: http://eksperten.dk/spm/588208

Opret de tre sider og så kan du uploade filer til mysql.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester