[ASP.NET] Bild in SQL DB speichern

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    [ASP.NET] Bild in SQL DB speichern

    Liebe Community

    Ich möchte auf meiner asp.net Startseite dem User die Möglichkeit geben ein Lokales Bild auszuwählen.
    Dieses Bild soll dan in eine SQL Datenbank gespeichert werden. Die Variable in der DB heisst "imageNews" und hat den Datentyp image.

    Welches Control ist geeigent um etwas ähnliches wie einen Bilder Dialog zu erhalten? (beachte dass ich von einem asp.net Projekt spreche)

    Und wie bekomme ich das ausgewählte Bild in meione DB? (Connection String usw. besteht)
    Muss ich das in BYtes umrechnen oder wie gehe ich da vor?

    Freundliche Grüsse

    Lingo
    Ahoi,

    Bilder kannst du serialisieren und so in die DB setzten, ist imho die bessere variante. (lasse mich wie immer aber auch gerne eines besseren belehren)
    Wenn du einen Dialog haben möchtest dann musst du dir den schon selbst bauen, am besten eignet sich dafür jquery.
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Axo ich dachte du willst einen dialog zum Anzeigen haben.
    Du kannst das Bild eigentlich serialisieren und das Ergebnis (solle ein String sein) in deine DB legen.
    ich hab mal das hier dazu gefunden
    hier
    Grüße Manu

    Was Gott dem Menschen erspart hat, kann der Computer.
    Billy ©, (*1932), Schweizer Aphoristiker
    Quelle: www.Aphorismen.de
    Serialisieren ist hier der falsche Begriff. Du kannst Dateien einfach uploaden lassen welche dann als IO.Stream zur Verfügung stehen. Aus diesem Stream heraus kannst du dann einfach eine Bitmap generieren. In der Datenbank selbst, würde ich es aber Binär ablegen(glaube aber es gab sogar sowas wie nen image-Datentyp <- wird aber vom entity framework wiederum als byte array gemappt und läuft somit wieder auf binär raus).

    Auf Clientseite ist der Upload nichts anderes als eine html form mit einem upload element. Ich gehe mal davon aus, dass du MVC3 oder 4 verwendest?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Genau ich möchte das ganze in der Datenbank als DAtentyp image hinterlegen.
    Also dann muss ich den Pfad in einen IO Stream reinlesen und daraus BYtes generieren und iese wiederum in die DB schreiben?
    Hast du mir ein Codebeispiel?

    //EDIT:

    Hab hier ein Code Beispiel gefunde verstehe jedoch nicht für was die einzelnen Zeilen zuständig sind.

    VB.NET-Quellcode

    1. Dim str As System.IO.Stream = ctrl.FileContent
    2. Dim buf(CInt(ctrl.FileContent.Length)) As Byte
    3. str.Read(buf, 0, CInt(ctrl.FileContent.Length))
    4. pic.image = buf

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lingo“ ()

    Erstmal sollte ich wissen was du verwendest.
    Ich arbeite derzeit selbst sehr viel mit asp für ein kommerzielles Projekt. Wir(team) haben uns für MVC4 entschieden was ich bis jetzt noch kein bisschen bereue. In Kombination lässt sich nahezu perfekt das Entityframework verwenden. Damit wird das DB-Schema durch Entites abstrahiert und du kannst die Tabellen als ganz normale Models verwenden.
    Wenn du das hast, ist es wirklich einfach. Ich kann dir da auch ein bisschen Code geben(jedoch in C# -> konvertieren kannst du es mit einem der vielen gratis Converter):
    Spoiler anzeigen

    Quellcode

    1. //
    2. // POST: /Admin/Import
    3. [HttpPost]
    4. public ActionResult Import(HttpPostedFileBase file)
    5. {
    6. if (file != null && file.ContentLength > 0)
    7. {
    8. //hier kommt dann dein Code:
    9. byte[] image = new byte[file.InputStream.Length];
    10. Debug.Assert(file.InputStream.Read(image, 0, image.Length) == image.Length);
    11. }
    12. return View();
    13. }

    In der View würde dann z.B. folgendes stehen:

    HTML-Quellcode

    1. @using (Html.BeginForm("Import", "Admin", FormMethod.Post, new { id="uploadForm", enctype = "multipart/form-data" }))
    2. {
    3. <input type="file" name="file" />
    4. <input type="submit" name="Submit" id="Submit" value="Importieren" />
    5. }




    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hab mir deinen Code noch nicht angesehen jedoch hab ich was hinbekommen:


    VB.NET-Quellcode

    1. Dim str As System.IO.Stream = FileUpload1.FileContent
    2. Dim buf(CInt(FileUpload1.FileContent.Length)) As Byte
    3. str.Read(buf, 0, CInt(FileUpload1.FileContent.Length))
    4. picture.image = buf


    Jedoch verstehe ich die Linien nicht wozu die da sind.
    Die erste Zeile holt den hinaufgeladenen Stream.
    Die zweite Zeile erstellt einen Puffer -> byte array und gibt dem array als Größe die Länge des Streams(der Datei)
    Die dritte Zeile liest alles
    Und die vierte Zeile gibt den Puffern dem Datenbank entity.

    Aber jetzt mach mal alles Schritt für Schritt. Lies das oben durch und dann beantworte mir die Frage was du verwendest.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @ErfinderDesRades

    Kann ich dir nicht beantworten.
    Mir wurde von meinem Ausbildner / Vorgesetzten gesagt ich solle dies in der Datenbank als "image" (Datentyp) speichern.

    @thefiloe

    Vielen Dank für die Erleuterung!
    Ich verstehe nicht ganz was du wissen willst aber ich Liste einmal auf:

    Ich benutze SQL Server 2012 dort habe ich eine Tabelle welche die Eigenschaft "imageNews" (Datentyp: image) hat. Ich möchte nun mittel ASP.NET Application mein Bild welches ich mit dem "FileUpload" ausgewählt habe in meine DB/Tabelle/imageNews speichern. Um Werte zu speichern benutze ich eine selbst geschriebene Klasse.

    VB.NET-Quellcode

    1. Dim mySql As New SQL
    2. Try
    3. mySql.AddParameter("@title", Me.title)
    4. mySql.AddParameter("@newsText", Me.newsText)
    5. mySql.AddParameter("@fkAdmin", fkAdmin)
    6. mySql.AddParameter("@startDate", Me.startDate)
    7. mySql.AddParameter("@endDate", Me.endDate)
    8. mySql.AddParameter("@shortText", Me.shortText)
    9. mySql.AddParameter("@imageNews", Me.imageNews)
    10. mySql.AddParameter("@idNews", idNews, DbType.Int32, ParameterDirection.ReturnValue)
    11. mySql.ExecuteStoredProc("spNewsInsert")
    12. Catch ex As Exception
    13. Throw
    14. Finally
    15. mySql.ClearParameters()
    16. End Try

    thefiloe schrieb:

    Was willst du damit sagen? Der Image-Datentyp ist nur ein binärer Datentyp mit einer variablen Länge.
    aber doch unkomprimiert, oder kann man da auch einen jpg- oder png-komprimierten Datenstrom reinpacken?

    Ich weiß auch nicht, wie ein Browser funktioniert, wenner ein Bild abruft: Werden da wirklich alle Farb-Werte aller Pixel übertragen? Wie gesagt - das wäre ja erheblicher Traffic inne Datenleitung.
    Aber vmtl. isses wohl so, auch wenns mich wundert.
    Ich glaube du hast da etwas falsch verstanden(oder ich). Laut msdn ist der Imae datentyp folgendes: Variable-length binary data from 0 through 2^31-1 (2,147,483,647) bytes..
    Ob du jetzt nen jpg, png oder sonst was rein haust ist komplett egal. Und auch ein Browser lädt sich Bilder über ne HttpWebRequest runter, dekodiert diese und stellt sie dar.

    Was den TE angeht: Wie oft und wie intensiv brauchst du die Datenbank. Sobald du das hin und wieder brauchst würde ich dir einfach empfehlen das Entity Framework zu verwenden.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Nimm das Entity Framework. Das wird auch in der Praxis in den meisten Fällen verwendet, da man sich so nen Brainfuck einfach nicht mehr antun will. Einfach in Visual Studio dem Projekt ein neues "ADO.NET Entity Data Model" hinzufügen und dann einfach dem Wizard folgen bis alles fertig ist.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Laut msdn ist der Imae datentyp folgendes: Variable-length binary data from 0 through 2^31-1 (2,147,483,647) bytes.
    Also scheints sich schlicht um rohe Bytes zu handeln, die man interpretieren kann wie man will.
    Aber gibts da nicht bereits einen anneren Datentyp für, glaub Blob hieß der - wie unterscheidet sich Image von Blob?

    ah - jetzt habich die Quelle auch gefunden - MS scheints so zu sehen wie ich auch:

    msdn schrieb:

    Die Datentypen ntext, text und image werden in einer zukünftigen Version von Microsoft SQL Server entfernt. Vermeiden Sie die Verwendung dieser Datentypen bei neuen Entwicklungen, und planen Sie die Änderung von Anwendungen, in denen sie gegenwärtig verwendet werden. Verwenden Sie stattdessen {...} varbinary(max).

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()