2009-08-22 10 views
16

J'ai un projet dans lequel j'utilise un générateur PDF pour envoyer un fichier à un utilisateur. Nous aimerions donner à l'utilisateur la possibilité de joindre ce fichier à un courriel, et nous éprouvons des difficultés à utiliser ensemble l'objet Stream et la logique de pièce jointe.Flux en tant que pièce jointe à System.Net.Mail est 0 octets

Nous commençons avec ABCpdf, qui a deux méthodes de sauvegarde: il peut enregistrer dans un flux, ou si vous lui donnez une chaîne, il va essayer d'enregistrer dans un fichier sur le disque là-bas. Nous avons fait les deux pas de problème.

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

Tout est surtout frais à ce stade - stream a plusieurs kilo-octets de données, et si vous .Save() dans un fichier, vous obtenez un fichier réel avec le même nombre d'octets.

Nous joindrez à un e-mail à ce stade (après initialisation de l'objet de messagerie, la mise à: Et de :, etc.):

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

... qui nous amène aussi loin que la réception d'un e-mail avec 0 octet, mais le nom de fichier correct. Tous les exemples que je trouve en ligne utilisent un StreamReader ou un StreamWriter ou un Flush() ou quelque chose. Il semble toujours que c'est plus compliqué que de simplement passer un Stream, mais peut-être seulement une ou deux lignes plus compliquées. Aucun de ces exemples ne commence par un flux - ils essaient toujours de transformer un tableau en un flux pour vous montrer à quel point c'est facile, ou saisir un fichier à partir du disque (ce que nous ne pouvons pas faire, c'est pourquoi nous sommes excités utiliser un flux). De toute façon, si quelqu'un peut expliquer ce que je fais mal ou ce que je devrais faire, je l'apprécierais vraiment. Merci.

+0

Dans le cas où il aide tout le monde, mon attachement était de 64 octets, mais en l'ouvrant dit que le dossier était invalide. La solution ci-dessous a également corrigé ce problème, ce n'est donc pas le cas si elle indique 0 octet. –

Répondre

35

Une estimation ... Retour dat flux jusqu'au début avant d'envoyer 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

Je voulais essayer ça - je vais tenter le coup. Merci. – dnord

+0

Cela devrait être le problème. Sauf si vous ou votre PDF api utilise des flux tamponnés. Ne présumez pas; Vérifiez le type du flux au dernier moment. – Will

+3

Je vous recommande d'utiliser "stream.Position = 0;" comme une façon plus simple de rembobiner le flux. Ils sont équivalents, mais 'Position' est plus lisible IMO :) –

-1

Avez-vous essayé d'enregistrer le fichier, puis de joindre le fichier au lieu de tenter de joindre un flux?

ajouté

Le processus normal serait ici

  1. Utilisez le flux pour créer un fichier sur le disque

  2. joindre le fichier à un e-mail

  3. Supprimer le fichier une fois terminé.

+0

L'enregistrement sur disque ne serait pas une option. Envisagez-vous de «sauver» ailleurs? Convertir Stream en byte [] ou quelque chose et en lisant cela? – dnord

+0

OK. Si enregistrer sur un disque n'est pas une option, alors je m'excuse, mon post sera complètement inutile. Je n'ai jamais essayé d'attacher un flux à un email. Je vais vérifier pour voir ce que les autres postent parce que je pense que ce serait mieux que de créer un fichier temporaire comme je le fais habituellement et de devoir ensuite le supprimer. – David

Questions connexes