2009-08-22 6 views
16

Ich habe ein Projekt, wo ich einen PDF-Generator verwenden, um eine Datei an einen Benutzer zu senden. Wir möchten dem Benutzer die Option geben, diese Datei stattdessen an eine E-Mail anzuhängen, und es fällt uns schwer, das Stream-Objekt und die Anhangslogik gemeinsam zu verwenden.Stream als Anhang zu System.Net.Mail ist 0 Bytes

Wir beginnen mit ABCpdf, das über zwei Speichermethoden verfügt: Es kann in einem Stream gespeichert werden, oder wenn Sie eine Zeichenfolge eingeben, versucht es in einer Datei auf der Festplatte zu speichern. Wir haben beide kein Problem gemacht.

Stream stream = new MemoryStream(); 
myPdf.Save(stream); 

Alles ist an dieser Stelle meist cool - stream mehrere Kilobyte Daten hat, und wenn Sie .Save() in eine Datei, erhalten Sie eine aktuelle Datei mit der gleichen Anzahl von Bytes.

So legen wir auf eine E-Mail an dieser Stelle (nach dem Mail-Objekt initialisiert wird, Einstellung zu: und Von :, etc.):

mail.Attachments.Add(new Attachment(stream, "myPdf.pdf")); 
mail.Send(); 

... die uns als Empfangen einer E-Mail bis bekommt mit 0 Bytes, aber der richtige Dateiname.

Alle Beispiele, die ich online finde, verwenden einen StreamReader oder einen StreamWriter oder einen Flush() oder so. Es scheint immer komplizierter zu sein, als einfach einen Stream zu übergeben, aber vielleicht nur ein oder zwei Zeilen komplizierter. Keines dieser Beispiele beginnt mit einem Stream - sie versuchen immer, ein Array in einen Stream zu verwandeln, um Ihnen zu zeigen, wie einfach das ist, oder eine Datei von der Festplatte zu holen (was wir nicht können, weshalb wir aufgeregt sind einen Stream verwenden).

Wie auch immer, wenn jemand erklären kann, was ich falsch mache oder was ich tun soll, würde ich es sehr schätzen. Vielen Dank.

+0

Falls es jemand hilft, war meine Befestigung 64 Bytes, aber es sagte, die Datei ungültig zu öffnen. Die folgende Lösung behebt dies auch, so dass es nicht nur 0 Byte heißt. –

Antwort

35

eine Vermutung ... Zurück dat Strom zu Beginn, bevor nit Senden

// Set the position to the beginning of the stream. 
stream.Seek(0, SeekOrigin.Begin); 
mail.Attachments.Add(new Attachment(stream, "myPdf.pdf")); 
mail.Send(); 
+0

Ich wollte das versuchen - ich werde es versuchen. Vielen Dank. – dnord

+0

Das sollte das Problem sein. Es sei denn, Sie oder Ihre PDF-API verwenden gepufferte Streams. Nehme nicht an; Überprüfen Sie den Typ des Streams im letzten Moment. – Will

+3

Ich würde empfehlen, "stream.Position = 0;" als eine einfachere Art den Strom zurückzuspulen. Sie sind gleichwertig, aber "Position" ist besser IMO :) –

-1

Haben Sie versucht, die Datei zu speichern und dann die Datei anzuhängen, anstatt zu versuchen, einen Stream anzuhängen?

hinzugefügt

Der normale Prozess hier wäre

  1. den Strom Verwenden Sie eine Datei auf der Festplatte auf eine E-Mail

  2. Bringen Sie die Datei erstellen

  3. löschen die Datei, wenn Sie damit fertig sind.

+0

Speichern auf Festplatte wäre keine Option. Denken Sie darüber nach, woanders zu "sparen"? Konvertiere Stream in Byte [] oder etwas und lese das zurück? – dnord

+0

OK. Wenn das Speichern auf einer Diskette keine Option ist, dann entschuldige ich mich, mein Beitrag wird völlig nutzlos sein. Ich habe noch nie versucht, einen Stream an eine E-Mail anzuhängen. Ich schaue zurück, um zu sehen, was andere schreiben, weil ich denke, dass das besser wäre, als eine temporäre Datei zu erstellen, wie ich es normalerweise mache, und sie dann löschen zu müssen. – David