我正在丢失fileupload

时间:2018-03-21 17:38:13

标签: c# asp.net smtp

我正在尝试创建一个系统来发送带附件的多封电子邮件。但它只是第一封附有图片的电子邮件,其余的都是空的。我究竟做错了什么?

正如你所看到的,我尝试了不同的(以及更多)。

 protected void BtnSenMail_Click(object sender, EventArgs e)
{
 string filename=null;
    string tema = TxtEmnefelt.Text;
    string indhold = TxtIndhold.Text;

    string fileExtencion = null;
    int fileSize = 0;
    string FileNameToAdd = null;
    fileSize = FiUpLoad.FileBytes.Length;
    emailList = (List<string>)Session["EmailList"];

if (FiUpLoad.HasFile)
        {
            HttpPostedFile postedFile = FiUpLoad.PostedFile;
            filename = Path.GetFileName(postedFile.FileName);
            fileExtencion = Path.GetExtension(filename);

            try
            {
                if (fileSize > 0)
                {
                    if (fileExtencion.ToLower() == ".jpg" || fileExtencion.ToLower() == ".bmp" || fileExtencion.ToLower() == ".gif" || fileExtencion.ToLower() == ".png" || fileExtencion.ToLower() == ".pdf")
                    {
                        //Session["imgUpload"] = Path.GetFileName(FiUpLoad.PostedFile.FileName);
                        Session["imgUpload"] = FiUpLoad.PostedFile.FileName.ToString();
                        FileNameToAdd = Path.GetFileName(FiUpLoad.PostedFile.FileName);
                        // FileName = Session["imgUpload"];
                        //mm.Attachments.Add(new Attachment(FiUpLoad.PostedFile.InputStream,FileName ));
                        //mm.Attachments.Add(new Attachment(FiUpLoad.PostedFile.InputStream, Convert.ToString(Session["imgUpload"])));

                    }
                    else
                    {
                        LblError.Text = "Kun jpg,png,gif.bmp og pdf filer kan vedhæftes!";
                        LblError.ForeColor = System.Drawing.Color.Red;
                        return;
                    }
                }
            }

 foreach (var item in emailList)
        {
            MailMessage mm = new MailMessage("xxxxxxxxxxx", item);
            mm.Subject = tema;
            mm.Body = indhold;
            //mm.Attachments.Add(new Attachment(FiUpLoad.PostedFile.InputStream, Convert.ToString(Session["imgUpload"])));
            mm.Attachments.Add(new Attachment(FiUpLoad.PostedFile.InputStream, FileNameToAdd));
            mm.IsBodyHtml = true;
            smtpClient.Send(mm);
        }

1 个答案:

答案 0 :(得分:0)

这是因为在循环的第一次迭代之后已经读取了InputStream。后续尝试从中创建附件将尝试读取相同的流,但是&#34;当前位置&#34;流已经结束了,所以他们不再读了。

你可以尝试,例如:

  • 通过seek将流读取光标重置为开头。不过,我不确定你是否可以在这种情况下做到这一点。

OR

  • for循环之前读取整个InputStream 到一个字节数组中,(如果文件不是太大)

  • 然后从数组中创建一个新的MemoryStream,然后在循环的每次迭代开始时使用seek 重置它,并将此流传递给{{1} }

OR

(如果由于某种原因添加附件会关闭流)

  • 在循环的每次迭代中重新创建一个新的MemoryStream,并使用先前命题的数组结果

可能有更有效的方法,但我希望你能得到这个想法。