C#接收浏览器上传文件报错:静态类型无法作为返回类型
解决ASP.NET文件上传接收的类型错误及实现步骤
错误原因
你用System.IO.File作为模型属性类型报错,是因为它是静态类,不能用来定义实例属性,自然没法接收前端上传的文件。
1. 修正模型属性类型
在ASP.NET Core中,接收上传文件要用到IFormFile类型(老版ASP.NET MVC用HttpPostedFileBase),修改后的模型代码:
using Microsoft.AspNetCore.Http; public class ProductStickerModel { [Required] [DataType(DataType.Upload)] [Display(Name = "Product Sticker Picture")] public IFormFile strFileName { get; set; } }
2. 控制器接收并处理文件
在Post方法里通过模型绑定获取文件,再处理邮件发送逻辑:
[HttpPost] public async Task<IActionResult> UploadAndSendEmail(ProductStickerModel model) { if (ModelState.IsValid && model.strFileName != null) { // 临时保存文件到服务器(也可以直接读取流,不用保存到磁盘) var tempFilePath = Path.Combine(Path.GetTempPath(), model.strFileName.FileName); using (var stream = new FileStream(tempFilePath, FileMode.Create)) { await model.strFileName.CopyToAsync(stream); } // 这里写发送邮件的逻辑,比如添加附件 // 示例(用System.Net.Mail): // using var mail = new MailMessage("sender@example.com", "recipient@example.com"); // mail.Subject = "Product Sticker"; // mail.Body = "Attached is the product sticker picture."; // mail.Attachments.Add(new Attachment(tempFilePath)); // using var smtp = new SmtpClient("smtp.example.com"); // smtp.Send(mail); // 发送完成后删除临时文件 System.IO.File.Delete(tempFilePath); return RedirectToAction("UploadSuccess"); } return View(model); }
3. 前端代码无需改动
你的HTML表单代码保持原样即可,asp-for会自动和IFormFile属性绑定:
<div class="form-group"> <label asp-for="strFileName"></label> <input asp-for="strFileName" type="file" class="form-control" /> <span asp-validation-for="strFileName" class="text-danger"></span> </div>
关键注意点
- 表单必须设置
enctype="multipart/form-data",如果用ASP.NET Core的formTagHelper,框架会自动添加;手动写表单的话要加上:<form asp-action="UploadAndSendEmail" enctype="multipart/form-data" method="post"> <!-- 表单内容 --> </form> - 若不想保存到磁盘,可直接读取
model.strFileName.OpenReadStream()获取文件流,用于邮件附件。
内容的提问来源于stack exchange,提问作者Ty Vents
相关产品推荐
相关产品推荐

