จะเพิ่มไฟล์แนบอีเมลจากไบต์อาร์เรย์ได้อย่างไร?


110

ฉันมีbyte[]เนื้อหาของไฟล์ ฉันต้องการส่งเป็นไฟล์แนบโดยใช้System.Net.Mail.

ฉันสังเกตเห็นว่าคลาสไฟล์แนบมี 1 โอเวอร์โหลดซึ่งรับสตรีม

Attachment att = new Attachment(Stream contentStream,string name);

เป็นไปได้ไหมที่จะผ่านการbyte[]โอเวอร์โหลดนี้?


BTW คุณยังสามารถใช้ att.ContentDisposition หากคุณต้องการตั้งค่าคุณสมบัติอื่น ๆ ของไฟล์ที่แนบมา (เช่น CreationDate)
John Gilmer

คำตอบ:


214

วิธีที่ง่ายที่สุด:

Attachment att = new Attachment(new MemoryStream(bytes), name);

โปรดทราบว่าหากคุณไม่ทำสิ่งที่น่าสนใจด้วยการดำเนินการแบบอะซิงโครนัสMemoryStreamก็ปลอดภัยที่จะปล่อยให้ไม่มีการเปิดเผยซึ่งอาจทำให้ชีวิตคุณง่ายขึ้น เป็นที่ยอมรับว่าไม่มีอะไรรับประกันได้ว่าจะเป็นจริงในอนาคต แต่ฉันคิดว่ามันไม่น่าจะเปลี่ยนแปลง ฉันไม่เห็นข้อบ่งชี้ใด ๆ ว่าการกำจัดสิ่งที่แนบมานั้นทิ้งกระแสของมันหรือไม่ :(


2
จุดดีฉันสังเกตเห็นเมื่อเพิ่มสิ่งที่แนบตามไฟล์ฉันจำเป็นต้องทิ้งวัตถุสิ่งที่แนบมาเพื่อปลดหมายเลขอ้างอิงบนไฟล์ แน่นอนว่าสตรีมควรได้รับการดูแลโดย GC เนื่องจากไม่ใช่การดำเนินการ IO?
JL.

FWIW คลาส Attachment ของ Mono เรียกDisposeใช้สตรีมเนื้อหาและจากกรณีทดสอบอย่างรวดเร็ว. NET 4.0 ก็ทำเช่นเดียวกัน ฉันไม่ได้ตลกสุด ๆ ที่เป็นเช่นนี้ แต่มีอยู่
Matt Enright

34

คุณจำเป็นต้องเปลี่ยนbyte[]ไปMemoryStreamใช้ที่เหมาะสมเกิน MemoryStream คอนสตรัค

Attachment att = new Attachment(new MemoryStream(myBytes), name);

โปรดสังเกตว่าพารามิเตอร์name ของตัวสร้างสิ่งที่แนบมาระบุชื่อของประเภทเนื้อหาของไฟล์แนบไม่ใช่ชื่อของสิ่งที่แนบมาเอง


4
ดูเหมือนว่าพารามิเตอร์ name คือชื่อของไฟล์ไม่ใช่ประเภทเนื้อหา ดูข้อสังเกต: msdn.microsoft.com/en-us/library/…
Uğur Aldanmaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.