如何在ASP.NET MVC 5中上传视频,并将视频文件从视图传递给方法

本文关键字:视频 文件 视图 方法 MVC NET ASP | 更新日期: 2023-09-27 18:27:04

我正在编写一个MVC 5 web应用程序来更新博客文章。我希望能够让用户将视频上传到内容文件夹,然后将文件名作为字符串存储在数据库中。然而,我似乎错过了一个重要的部分。

我有一个方法来更新帖子,除了视频部分外,其他部分都在工作。

public ActionResult Update(int? id, string title, string body, DateTime dateTime, string tags, Video video)
{
    if (!IsAdmin)
    {
        return RedirectToAction("Index");
    }
    var post = GetPost(id); // get the post object
    post.Title = title;
    post.Body = body;
    post.DateTime = dateTime;
    post.Tags.Clear();
    post.VideoFileName = UploadVideo(video);

我已经用一个属性为视频创建了一个类。

public class Video
{
    public HttpPostedFileBase File { get; set; }
}

然后使用与Update方法相同类的方法上传视频并返回文件名。

[HttpPost]
public string UploadVideo(Video video)
{
    if (video.File.ContentLength <= 0) return null;
    var fileName = Path.GetFileName(video.File.FileName);
    if (fileName == null) return null;
    var path = Path.Combine(Server.MapPath("~/Content/Videos"), fileName);
    video.File.SaveAs(path);
    return fileName;
}

然后我有一个Update方法的View,但我不知道如何将视频对象从该View获取到Update方法中,以便将其传递给UploadVideo方法。

<form action="@Href("~/Posts/Update")" method="post" id="postForm">
@if(Model.Id != -1)
{
    <input type="hidden" name="id" value="@Model.Id"/>
}
    @{ var dateTime = Model.DateTime.Year > 2000 ? Model.DateTime : DateTime.Now; }
    <input type="text" name="dateTime" value="@dateTime "/> Date<br />
    <input type="text" name="title" value="@Model.Title " /> Title<br />
    <input type="text" name="tags" value="@ViewBag.Tags " /> Tags<br />
    <textarea name="body" rows="10" cols="80">@Model.Body</textarea><br />
    <br/>
    <br/>
    <input type="file" name="video" />
    <br/>
    <br/>
    <input type="submit" name="submit" value="Submit" />
</form>

使用<input type="file" name="video" />会导致视频对象在传递到Update方法时为null。

如何将视频文件与视图中的所有其他文本数据集(如dateTimetitletagsbody)一起传递给Update方法?

如何在ASP.NET MVC 5中上传视频,并将视频文件从视图传递给方法

下面是一个片段,我只是在这里输入了一个想法,你可以理解,如果你需要更多信息,请告诉我

    [HttpPost]
    public ActionResult UploadFile()
    {
           var httpPostedFile = Request.Files[0];
           if (httpPostedFile != null) {
                // Validate the uploaded file if you want like content length(optional)
                // Get the complete file path
                var uploadFilesDir = System.Web.HttpContext.Current.Server.MapPath("~/Content/Videos");
                Directory.CreateDirectory(uploadFilesDir);
                var fileSavePath = Path.Combine(uploadFilesDir, httpPostedFile.FileName);
                // Save the uploaded file to "UploadedFiles" folder
                httpPostedFile.SaveAs(fileSavePath);
            }
            return Content("Uploaded Successfully");
    }

接受的答案解决了将视频文件从视图获取到方法中的问题。我只是在代码中发布我更改的内容,以防对任何人都有帮助。

[HttpPost]
public string UploadVideo(HttpFileCollection video)
{
    if (video.Count <= 0) return null;
    var fileName = Path.GetFileName(video.Get(0).FileName);
    var path = Path.Combine(Server.MapPath("~/Content/Videos"), fileName);
    // save video here
    return fileName;
}
[ValidateInput(false)]
public ActionResult Update(int? id, string title, string body, DateTime dateTime, string tags)
{
    if (!IsAdmin)
    {
        return RedirectToAction("Index");
    }
    var post = GetPost(id); // get the post object
    var video = System.Web.HttpContext.Current.Request.Files;
    post.Title = title;
    post.Body = body;
    post.DateTime = dateTime;
    post.Tags.Clear();
    post.VideoFileName = UploadVideo(video);
    // continued, more code
}
public class Video
{
    public HttpFileCollection File { get; set; }
}

我刚刚在View 中为form添加了enctype属性

<form action="@Href("~/Posts/Update")" method="post" id="postForm" enctype="multipart/form-data">