如何将文件上传为电子邮件中的附件?

时间:2014-09-15 18:24:22

标签: c# asp.net-mvc-4 file-upload

我有一个表单,但用户的数据不存储在任何地方,只是通过电子邮件发送。有没有人知道允许用户附加文件的简单方法?

截至目前,当用户点击提交时,jquery会收集数据并将其发送到“AjaxController.cs”。 (不使用表单元素)

HTML

<div class="form">
    <input type="text" name="Name">
    <input type="file" name="File">
    <button>Submit</button>
</div>

JS

$(document).ready(function(){
    $('button').click(function(){
        var data = {};
        $('input').each(function(){
            data[this.name] = this.value;
        }
        $.post('/Ajax/Email', data, function(){
            alert("Email Sent");
        });
    });
}

C#

public class AjaxController : Controller
{
    public ActionResult Email()
    {
        MailMessage message = new MailMessage("from@fake.com","marketing@fake.com");

        foreach (string form_inputs in Request.Form.Keys)
        {
            String  input_name  =   form_inputs.ToString();
            String  input_value =   Request.Form[form_inputs].Trim();
            if(input_name == "File")
            {
                System.Net.Mail.Attachment attachment;
                attachment = new System.Net.Mail.Attachment(input_value); //ERROR
                message.Attachments.Add(attachment);
            }
            if (input_name == "Name")
            {
                message.Body = "Name: " + input_value;
            }
        }
        SmtpClient client = new SmtpClient();
        client.Port = 25;
        client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Host = "SMTP.fake.com";

        client.Send(message);
    }
}

/ Ajax / Email只返回'Mail Sent!'

我收到一个错误,基本上说上传的文件本地不存在 - 当然 - 因为它尚未上传。此时文件存在于何处,如何访问它?

1 个答案:

答案 0 :(得分:3)

在MVC中上传的文件在Request集合中作为HttpPostedFileBase类型。您可以使用它来获取服务器上内存中文件的流实例,并将其直接附加到电子邮件中。使用FORM代码时,您必须在表单中设置enctype="multipart/form-data"

在您的控制器中:

public class AjaxController : Controller
{
    public ActionResult Email()
    {
        MailMessage message = new MailMessage("from@fake.com","marketing@fake.com");

        foreach (string form_inputs in Request.Form.Keys)
        {
            String  input_name  =   form_inputs.ToString();
            String  input_value =   Request.Form[form_inputs].Trim();
            if(input_name == "File")
            {            
                HttpPostedFileBase file = Request.Files[input_name];
                System.Net.Mail.Attachment attachment;
                attachment = new System.Net.Mail.Attachment(file.InputStream, file.FileName); //ERROR
                message.Attachments.Add(attachment);
            }
            if (input_name == "Name")
            {
                message.Body = "Name: " + input_value;
            }
        }
        SmtpClient client = new SmtpClient();
        client.Port = 25;
        client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;
        client.Host = "SMTP.fake.com";

        client.Send(message);
    }
}

我也不得不提到这可能是非常不安全(危险)的事实,这取决于你计划如何实现这一点。请务必在发送之前对文件执行一些验证(内存中的病毒扫描/内容类型限制等)。


因为您正在使用Ajax(POST方法使用的方法),您将面临一些额外的挑战。直到最近,Ajax文件上传必须使用iframe hack完成。使用支持XHR2的现代浏览器,只能使用JavaScript中的FormData对象来完成。幸运的是,这些因素不会影响服务器端代码。有关详细信息,请参阅此问题: jQuery Ajax File Upload

有关使用FormData的更多信息,请参阅此处:Sending multipart/formdata with jQuery.ajax

这是一篇深入讨论ajax表单上传的文章:http://abandon.ie/notebook/simple-file-uploads-using-jquery-ajax