我想使用 mvc5 以附件形式上传文件

Posted

技术标签:

【中文标题】我想使用 mvc5 以附件形式上传文件【英文标题】:I want upload file in my attachment form using mvc5 【发布时间】:2021-08-04 18:23:55 【问题描述】:

我必须创建带有上传文件功能的表单。我使用 .NET 框架 asp.net mvc5 和 C# 作为语言。但我找不到表格的教程。我尽力了,我真的需要你们的帮助。我将在这里添加我的模型、视图和控制器。

我想知道如何创建上传文件功能。我尝试了很多,但我找不到方法。我真的需要帮助

型号

using System.Collections.Generic;

namespace PMSWebApplication.Models.DomainModels

    public class Attachment
    
        public Attachment()
        
            BugFixes = new HashSet<BugFix>();
            Updates = new HashSet<Update>();
        
        public int Id  get; set; 
        public int ProjectId  get; set; 
        public Project Project  get; set; 
        public string UserId  get; set; 
        public ApplicationUser User  get; set; 
        public string FileName  get; set; 
        public string UploadFile  get; set; 
        //public string Type  get; set; 
        public string Description  get; set; 

        public virtual ICollection<BugFix> BugFixes  get; set; 
        public virtual ICollection<Update> Updates  get; set; 


    

控制器

using System.Data.Entity;
using System.Threading.Tasks;
using System.Net;
using System.Web.Mvc;
using PMSWebApplication.Models;
using PMSWebApplication.Models.DomainModels;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.AspNet.Identity;

namespace PMSWebApplication.Controllers

    public class AttachmentsController : Controller
    
        private ApplicationDbContext db = new ApplicationDbContext();

        // GET: Attachments
        public async Task<ActionResult> Index(/*HttpPostedFileBase file*/)
        
           
            var attachments = db.Attachments.Include(a => a.Project).Include(a => a.User);
            return View(await attachments.ToListAsync());
        


        // GET: Attachments/Details/5
        public async Task<ActionResult> Details(int? id)
        
            if (id == null)
            
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            
            Attachment attachment = await db.Attachments.FindAsync(id);
            if (attachment == null)
            
                return HttpNotFound();
            
            return View(attachment);
        

        // GET: Attachments/Create
        public ActionResult Create()
        

            var users = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db)).Users;

            ViewBag.ProjectId = new SelectList(db.Projects, "Id", "ProjectName");
            ViewBag.UserId = new SelectList(users, "Id", "Email");
            return View();
        

        // POST: Attachments/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Create([Bind(Include = "Id,ProjectId,UserId,FileName,UploadFile,Type,Description")] Attachment attachment)
        
            if (ModelState.IsValid)
            
                db.Attachments.Add(attachment);
                await db.SaveChangesAsync();
                return RedirectToAction("Index");
            
            var users = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db)).Users;

            ViewBag.ProjectId = new SelectList(db.Projects, "Id", "ProjectName", attachment.ProjectId);
            ViewBag.UserId = new SelectList(users, "Id", "Email", attachment.UserId);
            return View(attachment);
        

        protected override void Dispose(bool disposing)
        
            if (disposing)
            
                db.Dispose();
            
            base.Dispose(disposing);
        
    

查看索引

@model IEnumerable<PMSWebApplication.Models.DomainModels.Attachment>

@
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";


<h2>Attachments</h2>

@*@using (Html.BeginForm("Upload", "Upload", FormMethod.Post,new  enctype="multipart/form-data"))

    <input type="file" name="file" />
    <br/>*@
    @*<input type="submit" value="Upload" class="btn btn-primary" />*@

@**@

<p>
    @Html.ActionLink("Create New Attachment", "Create", null, new  @class = "btn btn-info" )
</p>

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Project.ProjectName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.User.UserLevel)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.FileName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.FileType)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Type)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Description)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) 
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Project.ProjectName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.User.UserLevel)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FileName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FileType)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Type)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new  id = item.Id , new  @class = "btn btn-primary btn-sm" ) |
            @Html.ActionLink("Details", "Details", new  id = item.Id , new  @class = "btn btn-info btn-sm" ) |
            @Html.ActionLink("Delete", "Delete", new  id = item.Id , new  @class = "btn btn-warning btn-sm" )
        </td>
    </tr>


</table>

查看-创建

@model PMSWebApplication.Models.DomainModels.Attachment

@
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";


<h2>Create</h2>


@using (Html.BeginForm()) 

    @Html.AntiForgeryToken()
    

    <div class="form-horizontal">
        <h4>Attachment</h4>
        <hr />
        @Html.ValidationSummary(true, "", new  @class = "text-danger" )
        <div class="form-group">
            @Html.LabelFor(model => model.ProjectId, "ProjectId", htmlAttributes: new  @class = "control-label col-md-2" )
            <div class="col-md-10">
                @Html.DropDownList("ProjectId", null, htmlAttributes: new  @class = "form-control" )
                @Html.ValidationMessageFor(model => model.ProjectId, "", new  @class = "text-danger" )
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.UserId, "UserId", htmlAttributes: new  @class = "control-label col-md-2" )
            <div class="col-md-10">
                @Html.DropDownList("UserId", null, htmlAttributes: new  @class = "form-control" )
                @Html.ValidationMessageFor(model => model.UserId, "", new  @class = "text-danger" )
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.FileName, htmlAttributes: new  @class = "control-label col-md-2" )
            <div class="col-md-10">
                @Html.EditorFor(model => model.FileName, new  htmlAttributes = new  @class = "form-control"  )
                @Html.ValidationMessageFor(model => model.FileName, "", new  @class = "text-danger" )
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.FileType, htmlAttributes: new  @class = "control-label col-md-2" )
            <div class="col-md-10">
                @Html.EditorFor(model => model.FileType, new  htmlAttributes = new  @class = "form-control"  )
                @Html.ValidationMessageFor(model => model.FileType, "", new  @class = "text-danger" )
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Type, htmlAttributes: new  @class = "control-label col-md-2" )
            <div class="col-md-10">
                @Html.EditorFor(model => model.Type, new  htmlAttributes = new  @class = "form-control"  )
                @Html.ValidationMessageFor(model => model.Type, "", new  @class = "text-danger" )
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Description, htmlAttributes: new  @class = "control-label col-md-2" )
            <div class="col-md-10">
                @Html.EditorFor(model => model.Description, new  htmlAttributes = new  @class = "form-control"  )
                @Html.ValidationMessageFor(model => model.Description, "", new  @class = "text-danger" )
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>


<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts 
    @Scripts.Render("~/bundles/jqueryval")

【问题讨论】:

附件是进入请求正文的数据。这是一个以两个破折号开头的 MIME 附件。将文件添加为 MIME。见 msdn:docs.microsoft.com/en-us/previous-versions/office/developer/… 【参考方案1】:

以下是来自工作站点的相关 sn-ps:

// cshtml
<input type="file" name="ReportFile" />

// viewmodel
public class RequestViewModel

   public HttpPostedFileBase ReportFile  get; set; 


// controller method
public virtual ActionResult Upload(RequestViewModel req)

   var fileName = Path.GetFileName(req.ReportFile.FileName);

   using (var rdr = new BinaryReader(req.ReportFile.InputStream))
   
      var content = rdr.ReadBytes(req.ReportFile.ContentLength);
   

【讨论】:

以上是关于我想使用 mvc5 以附件形式上传文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mvc5 中更新/删除上传的图像

怎么在论坛不能上传附件了```

以html形式上传多个文件

iOS文件上传

如何使用 REST API 将文件和附件上传到 sobject 记录?

阿里云附件文件流的形式上传下载