2009-08-22 7 views
16

Ho un progetto in cui sto utilizzando un generatore di PDF per inviare un file a un utente. Vorremmo offrire all'utente la possibilità di allegare questo file a una e-mail, e abbiamo problemi a utilizzare insieme l'oggetto Stream e la logica Attachment.Stream come allegato a System.Net.Mail è 0 byte

Iniziamo con ABCpdf, che ha due metodi di salvataggio: può salvare su un flusso o, se gli dai una stringa, proverà a salvarlo su un file sul disco. Non abbiamo fatto nessun problema

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

Tutto è per lo più fresco, a questo punto - stream ha diversi kilobyte di dati, e se si .save() in un file, si ottiene un file vero e proprio con lo stesso numero di byte.

Così che attribuiamo a una e-mail a questo punto (dopo aver inizializzato l'oggetto di posta, l'impostazione A: e Da :, ecc):

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

... che ci porta fino a ricevere una e-mail con 0 byte, ma il nome file corretto.

Tutti gli esempi che trovo online utilizzano StreamReader o StreamWriter o Flush() o qualcosa del genere. Sembra sempre più complicato del semplice passaggio di un flusso, ma forse solo una o due righe sono più complicate. Nessuno di questi esempi inizia con uno Stream: cercano sempre di trasformare un array in un flusso per mostrarti quanto sia facile, o prendere un file dal disco (cosa che non possiamo fare, ed è per questo che siamo eccitati usare un flusso).

In ogni caso, se qualcuno può spiegare cosa sto facendo male o cosa dovrei fare, lo apprezzerei molto. Grazie.

+0

In caso aiuta nessuno, il mio attaccamento era di 64 byte, ma sull'apertura che ha detto il file non è valido. La soluzione di seguito ha risolto anche questo, quindi non è solo se dice 0 byte. –

risposta

35

Una supposizione ... Torna dat torrente fino all'inizio prima di inviare nit

// 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

Avevo intenzione di provarlo - ci penserò io. Grazie. – dnord

+0

Questo dovrebbe essere il problema. A meno che tu o la tua API PDF non stiate utilizzando i flussi bufferizzati. Non dare per scontato; controlla il tipo di flusso all'ultimo momento. – Will

+3

Mi consiglia di utilizzare "stream.Position = 0;" come un modo più semplice di riavvolgere il flusso. Sono equivalenti, ma 'Position' è più leggibile IMO :) –

-1

Hai provato a salvare il file e quindi a collegare il file, anziché tentare di collegare uno stream?

aggiunto

Il processo normale qui sarebbe

  1. Utilizzare il flusso di creare un file su disco

  2. allegare il file a una e-mail

  3. Delete il file una volta fatto.

+0

Il salvataggio su disco non sarebbe un'opzione. Stai pensando di "salvare" da qualche altra parte? Conversione di Streaming in byte [] o qualcosa e la lettura di ciò che è fuori? – dnord

+0

OK. Se salvare su un disco non è un'opzione, allora mi scuso, il mio post sarà del tutto inutile. Non ho mai provato ad allegare un flusso a un'email. Controllerò per vedere cosa postano altri utenti perché penso che sarebbe meglio che creare un file temporaneo come faccio di solito e doverlo eliminare. – David