Announcement

Collapse
No announcement yet.

Byte-Array to Image - Mailversand

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

  • Byte-Array to Image - Mailversand

    Hallo Community,

    ich hab ein Problem, ich lade ein Bild per upload(insert) auf einem Mssql-Server hoch und hole dieses per download(select) von dem Server.
    Sobald ich auf mein Butten klicke, kommt ein postback und eine neue Seite mit dem Bild wird geladen. Dies möchte ich nicht, sondern nur das Bild als E-Mail Anhang versenden.

    Hier wird mein Array umgewandelt:
    [highlight=vbnet]
    Dim MyData() As Byte
    MyData = myRow("FileImage")
    Response.Buffer = True
    Response.ContentType = "Image/JPEG"
    Response.BinaryWrite(MyData)[/highlight]

    Dann Array als String und in Attachment hinzufügen
    [highlight=vbnet]
    Dim conv = Convert.ToBase64String(MyData)
    Dim atta As New System.Net.Mail.Attachment(conv)
    [/highlight]

    Tools ist mein Mailmessage

    [highlight=vbnet]
    Dim tools As New Tools
    Dim mBody As String
    mBody = "Hallo " + firstname + " " + lastname + "," + vbCrLf + vbCrLf
    mBody = mBody + "Sie haben Ihr Bild erfolgreich hochgeladen und versendet" + vbCrLf[/highlight]

    [highlight=vbnet]
    tools.sendMail(MailTo, "[email protected]", "BBC", "CC", "Betreff", mBody, atta)[/highlight]

    Fehlermeldung:"Der angegebene Pfad und/oder Dateiname ist zu lang. Der vollständig qualifizierte Dateiname muss kürzer als 260 Zeichen und der Pfadname kürzer als 248 Zeichen sein."
    [highlight=vbnet]Dim atta As New System.Net.Mail.Attachment(conv)[/highlight]


    An sich ja klar, aber ich such mir jetzt schon seit Tagen einen Wolf, wie und was ich ändern muss, damit das ByteArray als Image zurück convertiert wird.

    Ich hoffe ihr könnt mir helfen

  • #2
    Hallo,

    ich bin keine ASP.net Experte, aber wenn du das Bild in den Response-Stream schreibst ist das Verhalten normal.
    Schreib das einfach nciht rein.

    Zur Fehlemeldung: schau mal welcher Argument diese Methode benötigt. Hier glaubt es ist ein Dateipfad und tatsächlich ist es der Binary64-encoded string.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Okay, ich habe jetzt das Response-Stream rausgenommen. Dadurch behob sich das Problem, dass das Bild per "neuem" Link auf einer neuen Seite angezeigt wurde. Schonmal Danke für den Tipp gfoidl

      So fülle ich meine Spalte, mit einem Byte Array
      [highlight=vbnet]
      Dim fs As Stream = FileUpload1.PostedFile.InputStream
      Dim br As New BinaryReader(fs)
      Dim bytes() As Byte = br.ReadBytes(fs.Length)[/highlight]

      Jetzt habe ich den Code ein bisschen umgeschrieben.
      Mit diesem möchte ich aus einen Byte Array wieder ein Image machen.
      MyData wurde der Wert von der Tabelle übergeben (Byt-Array)
      [highlight=vbnet]
      Dim conv = Convert.ToBase64String(MyData)
      Dim MS As New IO.MemoryStream(conv)
      Dim img As Image
      img = Image.FromStream(MS)[/highlight]


      IMG will ich als Anhang an die Mail anhängen.
      [highlight=vbnet]
      tools.sendMail(MailTo, "[email protected]", "BBC", "CC", "Betreff", mBody,img)[/highlight]

      Jetzt kommt folgende Meldung: "Der Wert von Typ" System.Drawing.Image kann nicht in "System.Net.Mail.Attachment" konvertiert werden."

      Comment


      • #4
        Eine Mail kann kein Bild enthalten. SMTP -> Simple Mail Transfer Protokoll.

        Das nun fast jeder HTML oder RTF Mails sendet ist ein "Service" der Mailclients, die diesen Inhalt dann per HTML anzeigen

        Ein Attachment einer Mail besteht darin, die Bytes des Anhanges Base64 codiert an den Mailtext zu hängen. Dabei erzeugt man keine reine Textmail mehr, sondern eine Mulitpart-Mail. Für jeden Part wird festgelegt, was dieser enthält bsp. application/pdf eine PDF-Datei. Der Client schaut in den Content-Type des Parts, holt sich den Base64 codierten String, speichert den ab, und startet das mit dem Content-Type verbundene Programm oder zeigt es direkt im Client an.

        Also ist dein Bild in ein Attachment zu wandeln
        Christian

        Comment


        • #5
          Okay,
          also brauche ich nur den Base64 String von der Tabelle. Also meine Variable conv.

          Und wie lege ich durch Programmierung den Part z.b Image/JPEG fest?

          Mh, bin halt ein neuling, deswegen entschuldige für die vielen Fragen. Und danke für die bereits geleisteten Antworten

          Comment


          • #6
            http://msdn.microsoft.com/de-de/libr...ttachment.aspx

            Das kommt dann an dein sendMail(.....Attachtment)
            Christian

            Comment


            • #7
              Danke, auf die Seite bin ich auch schon öfters gestoßen.

              Deiner Meinung nach sollte ich dieses benutzen? "Attachment(String, ContentType)"

              String soll der Name sein und Contentype das Format?

              Beide habe ich auch in der Tabelle mit abgespeichert. Aber ich brauch doch die binär daten von dem Bild?


              Ich habe jetzt diesen Code geschrieben: MyName ist der Name der Datei und conv der Binary-Array konvertiert in einen String.

              [highlight=vbnet]Dim Attr As New Attachment(MyName, conv)[/highlight]

              Beim Event-klick kommt folgende Fehlermeldung:

              "Die Datei "C:\Programme\Gemeinsame Dateien\Microsoft Shared\DevServer\10.0\dual_screen_wallpaper_021.jp g" konnte nicht gefunden werden."

              Ich habe doch das Bild binär in die Tabelle eingefügt und lese sie somit auch wieder aus, was hab ich falsch gemacht?

              Vielen Dank
              Zuletzt editiert von FelixM; 04.07.2011, 16:53.

              Comment


              • #8
                String soll der Name sein und Contentype das Format?
                Attachment(Stream, ContentType)

                Ein Strem auf deinen Bildstream übergeben
                Zuletzt editiert von Christian Marquardt; 04.07.2011, 16:59.
                Christian

                Comment


                • #9
                  Danke, Danke,Danke Marquardt für deine Hilfe

                  Ich habe es geschaft. Hier mein Code:
                  [highlight=vbnet]
                  'Connenctionstring und SQLAdapter
                  Try
                  con.Open()
                  da.Fill(ds, "FileName")
                  'Holt den Dateinamen aus der Tabelle
                  Dim mRow As DataRow
                  mRow = ds.Tables("FileName").Rows(0)
                  MyName = mRow("FileName")
                  'Holt das Byte-Array aus der Tabelle
                  Dim myRow As DataRow
                  myRow = ds.Tables("FileName").Rows(0)
                  MyData = myRow("FileImage")
                  Finally
                  MyCB = Nothing
                  ds = Nothing
                  da = Nothing
                  con.Close()
                  con = Nothing
                  End Try
                  'Byte-Array to Stream
                  Dim MS As New IO.MemoryStream(MyData)
                  'E-Mail wird gebaut und versendet
                  Dim firstname As String = ASPxGridViewAngemeldeterUser.GetRowValues(0, "firstname")
                  Dim lastname As String = ASPxGridViewAngemeldeterUser.GetRowValues(0, "lastname")
                  Dim tools As New Tools
                  Dim mBody As String
                  mBody = "Hallo " + firstname + " " + lastname + "," + vbCrLf + vbCrLf
                  mBody = mBody + "Sie haben Ihr Bild:" + MyName + vbCrLf
                  mBody = mBody + "erfolgreich hochgeladen und versendet."+ vbCrLf
                  mBody = mBody + "Sie finden Ihr Bild im Anhang."
                  'Dem Attr wird der Stream und der Name übergeben
                  Dim Attr As New Attachment(MS, MyName)
                  Dim MailTo As String = ASPxGridViewAngemeldeterUser.GetRowValues(0, "email")
                  'an den user selbst und an den zugehörigen mandant
                  tools.sendMail(MailTo, "[email protected]", "BBC", "CC", "Betreff", mBody,Attr)[/highlight]
                  Zuletzt editiert von FelixM; 05.07.2011, 09:31.

                  Comment


                  • #10
                    Hallo FelixM,

                    ein paar Tipps zum Code:

                    Das lesen der Daten von der DB und das sender der Email siind zwei verschieden Dinge -> daher erstell auch 2 Methoden dafür. Der EmailSenden-Methode kannst du als Argumente alles benötigte übergeben. Wenn du Visual Studio verwendest kannst du den Teil für das Senden der Email markieren und dann Rechtslick -> Refactor ->Extract Method wählen.

                    Beim Holen der DAten aus der DB verwendest du ganz korrekt TRY Finally um die Verbindung zu schließen. Wenn du aber Using verwendest wird dies autoamtisch für dich vom Compiler erledigt.

                    Das wärs mal auf gröbste .


                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Danke gfoidl für den Tipp, werd ich so umsetzten.

                      Comment

                      Working...
                      X