我有一个表单,但用户的数据不存储在任何地方,只是通过电子邮件发送。有没有人知道允许用户附加文件的简单方法?
截至目前,当用户点击提交时,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!'
我收到一个错误,基本上说上传的文件本地不存在 - 当然 - 因为它尚未上传。此时文件存在于何处,如何访问它?
答案 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