2009-08-22 8 views
16

Tengo un proyecto en el que estoy usando un generador de PDF para enviar un archivo a un usuario. Nos gustaría dar al usuario la opción de adjuntar este archivo a un correo electrónico en su lugar, y estamos teniendo problemas para usar el objeto Stream y la lógica de Adjuntos juntos.Transmitir como un archivo adjunto a System.Net.Mail es 0 bytes

Comenzamos con ABCpdf, que tiene dos métodos de guardado: se puede guardar en un flujo, o si le da una cadena, intentará guardar en un archivo en el disco allí. Hemos hecho ambas cosas sin problema.

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

Todo es sobre todo fresco en este punto - stream tiene varios kilobytes de datos, y si .Save() en un archivo, se obtiene un archivo real con el mismo número de bytes.

Así que adjuntar a un correo electrónico en este momento (después de inicializar el objeto de correo, fijando a: y de :, etc.):

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

... que nos llega hasta la recepción de un correo electrónico con 0 bytes, pero el nombre de archivo correcto.

Todos los ejemplos que encuentro en línea usan un StreamReader o un StreamWriter o un Flush() o algo así. Siempre parece que es más complicado que simplemente pasar un Stream, pero tal vez solo una o dos líneas más complicadas. Ninguno de esos ejemplos comienza con un Stream: siempre intentan convertir un array en un Stream para mostrar lo fácil que es, o tomar un archivo del disco (lo cual no podemos hacer, y es por eso que estamos emocionados usar un Stream).

De todos modos, si alguien puede explicar lo que estoy haciendo mal o lo que debería estar haciendo, realmente lo agradecería. Gracias.

+0

En caso de que ayuda a nadie, mi apego fue de 64 bytes, pero al abrirla dijo que el archivo no es válido. La solución a continuación también solucionó esto, por lo que no es solo si dice 0 bytes. –

Respuesta

35

Una conjetura ... Volver dat corriente hasta el comienzo antes de enviar 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

Tenía intención de intentar eso, lo intentaré. Gracias. – dnord

+0

Ese debería ser el problema. A menos que usted o su api PDF esté utilizando secuencias de búfer. No asuma; verifica el tipo de transmisión en el último momento. – Will

+3

Recomiendo usar "stream.Position = 0;" como una forma más simple de rebobinar la secuencia. Son equivalentes, pero 'Posición' es más fácil de leer IMO :) –

-1

¿Ha intentado guardar el archivo y luego adjuntar el archivo, en lugar de intentar adjuntar una secuencia?

añade

El proceso normal en este caso sería

  1. utilizar la secuencia para crear un archivo en el disco

  2. adjuntar el archivo a un correo electrónico

  3. Eliminar el archivo cuando haya terminado con él.

+0

Guardar en disco no sería una opción. ¿Estás pensando en "salvar" en otro lugar? ¿Convertir Stream a byte [] o algo así y leer eso? – dnord

+0

OK. Si guardar en un disco no es una opción, entonces me disculpo, mi publicación será completamente inútil. Nunca intenté adjuntar una transmisión a un correo electrónico. Volveré a consultar para ver lo que otros publican porque creo que sería mejor que crear un archivo temporal como lo hago normalmente y luego tener que eliminarlo. – David

Cuestiones relacionadas