2009-08-22 36 views
16

Tôi đã có dự án nơi tôi đang sử dụng trình tạo PDF để gửi tệp cho người dùng. Thay vào đó, chúng tôi muốn cung cấp cho người dùng tùy chọn đính kèm tệp này vào email và chúng tôi đang gặp sự cố khi sử dụng đối tượng Luồng và Logic đính kèm cùng nhau.Luồng dưới dạng tệp đính kèm vào System.Net.Mail là 0 byte

Chúng tôi bắt đầu với ABCpdf, có hai phương pháp lưu: nó có thể lưu vào Luồng hoặc nếu bạn đưa chuỗi đó, nó sẽ cố gắng lưu vào tệp trên đĩa đó. Chúng tôi đã làm cả hai không có vấn đề.

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

Mọi thứ đều chủ yếu là mát mẻ vào thời điểm này - stream có một vài kilobyte dữ liệu, và nếu bạn lệnh .save() vào một tập tin, bạn nhận được một tập tin thực tế với cùng một số byte.

Vì vậy, chúng tôi đính kèm vào e-mail vào thời điểm này (sau khi khởi tạo đối tượng mail, thiết Đến: và Từ :, vv):

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

... mà được chúng ta như xa như nhận được một email với 0 byte, nhưng tên tệp thích hợp.

Tất cả các ví dụ tôi đang tìm kiếm trực tuyến đều sử dụng StreamReader hoặc StreamWriter hoặc Flush() hoặc gì đó. Nó luôn luôn có vẻ như nó phức tạp hơn chỉ đơn giản là đi qua một Stream, nhưng có lẽ chỉ có một hoặc hai dòng phức tạp hơn. Không có ví dụ nào trong số đó bắt đầu bằng luồng - chúng luôn cố gắng biến một mảng thành Luồng để cho bạn thấy mức độ dễ dàng, hoặc lấy tệp từ đĩa (chúng tôi không thể làm được, đó là lý do chúng tôi hào hứng để sử dụng Luồng).

Dù sao, nếu có ai có thể giải thích những gì tôi đang làm sai hoặc những gì tôi nên làm, tôi thực sự đánh giá cao nó. Cảm ơn.

+0

Trong trường hợp nó giúp mọi người, tập tin đính kèm của tôi là 64 byte nhưng mở nó nói các tập tin không hợp lệ. Các giải pháp dưới đây cố định này cũng như vậy nó không chỉ là nếu nó nói 0 byte. –

Trả lời

35

Một đoán ... Trở dat suối lên đến đầu trước khi gửi 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

Tôi có ý định thử điều đó - tôi sẽ cho nó một shot. Cảm ơn. – dnord

+0

Đó phải là vấn đề. Trừ khi bạn hoặc api PDF của bạn đang sử dụng các luồng đệm. Đừng giả sử; kiểm tra loại luồng tại thời điểm cuối cùng. – Will

+3

Tôi khuyên bạn nên sử dụng "stream.Position = 0;" như một cách đơn giản hơn để tua luồng. Chúng tương đương, nhưng 'Vị trí' là IMO dễ đọc hơn :) –

-1

Bạn đã thử lưu tệp rồi đính kèm tệp chứ không phải cố đính kèm luồng?

thêm

Quá trình bình thường ở đây sẽ là

  1. Sử dụng các dòng để tạo ra một tập tin trên đĩa

  2. Đính kèm tập tin vào email

  3. Xóa các tập tin khi thực hiện với nó.

+0

Lưu vào đĩa sẽ không phải là một tùy chọn. Bạn đang nghĩ đến việc "cứu" một nơi khác? Chuyển đổi dòng thành byte [] hoặc một cái gì đó và đọc mà quay trở lại? – dnord

+0

OK. Nếu lưu vào đĩa không phải là một tùy chọn, thì tôi xin lỗi, bài đăng của tôi sẽ hoàn toàn không hữu ích. Tôi chưa bao giờ thử đính kèm luồng vào email. Tôi sẽ kiểm tra lại để xem những gì người khác đăng bài vì tôi nghĩ rằng đó sẽ là tốt hơn so với việc tạo ra một tập tin tạm thời như tôi thường làm và sau đó phải xóa nó. – David

Các vấn đề liên quan