将图像上传到目录并将图像名称写入数据库

Posted

技术标签:

【中文标题】将图像上传到目录并将图像名称写入数据库【英文标题】:Uploading Image to Directory and Writing Image Name to Database 【发布时间】:2016-09-07 10:27:05 【问题描述】:

我正在使用 ASP.NET MVC 4,我正在尝试将图像上传到目录并将图像名称写入我的数据库;但是,文件名显示为空,并且当 HttpPostedFileBase 文件变量是我的控制器。

这是模型中的文件名:

public string ImageName  get; set; 

这是视图:

@using (html.BeginForm()) 
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Expense</legend>
<div class="editor-label">
            @Html.LabelFor(model => model.ImageName)
        </div>
        <div class="editor-field">
            <input type="file" name="file" />
        </div>


        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

这是Controller中的HttpPost Create()方法:

[HttpPost]
        [ValidateAntiForgeryToken]
        [Authorize]
        public ActionResult Create(Expense expense, HttpPostedFileBase file)
        
            if (ModelState.IsValid)
            

                var fullName = db.UserProfiles.Where(u => u.UserId == expense.UserId).Select(n => n.FullName).ToArray()[0];

                if (file.ContentLength > 0)
                
                    var fileName = Path.GetFileName(file.FileName);
                    var path = Path.Combine(Server.MapPath("~/Images/" + fullName), fileName);
                    file.SaveAs(path);
                

                var query =
                    from e in db.Expenses
                    where e.ExpenseId == expense.ExpenseId
                    select e;

                foreach (Expense exp in query)
                
                    exp.ImageName = file.FileName;
                

                db.Expenses.Add(expense);
                db.SaveChanges();
                return RedirectToAction("Index");
            

            var errors = ModelState.Values.SelectMany(v => v.Errors);
            ViewBag.UserId = new SelectList(db.UserProfiles, "UserId", "UserName", expense.UserId);
            return View(expense);
        

【问题讨论】:

您是否尝试在检查/保存文件之前创建一个局部变量,并将其值设置为file.FileName?然后你可以在你的foreach循环中引用这个变量 嘿@GeoffJames,我试过这样做。我仍然收到对象引用错误。 好的,所以file 本身就是null,如果我理解正确?确保在您的表单中,您将文件字段的name id 设置为file,并设置表单的enctype="multipart/form-data" 并确保方法为post @GeoffJames 你知道对象引用错误出了什么问题吗? 您需要在 @Html.BeginForm 助手中设置一些东西 - 您缺少重要的一点 "enctype="multipart/form-data" 以便将文件传递给控制器​​,请参阅下面的答案:) 【参考方案1】:

您需要确保表单的enctype 设置为"multipart/form-data",以便将文件发送到控制器。

在您的@Html.BeginForm() 方法中,您需要传递一些参数:

@Html.BeginForm(action,
                controller,
                FormMethod.Post,
                new  enctype="multipart/form-data") // <-- Important for uploading files

在这种情况下,action 是您发布到 ("Create") 的操作的名称,controller 是该操作所在的控制器的名称(在您的实例中不知道) ,但作为示例"ExpenseController")。

另外,我想确保&lt;input ...idname 属性都已设置。

希望这会有所帮助!

编辑 您还可以将nullnull 作为Html.BeginForm 方法的操作和控制器参数传递,如下所示:

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

【讨论】:

工作就像一个魅力!谢谢杰夫! :-)

以上是关于将图像上传到目录并将图像名称写入数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像的名称及其坐标写入 save.txt 文件?

如何通过对话框将图像上传到 SQLite 数据库,并将图像输出到 XAML?

DreamFactory:如何将图像上传到文件服务器并将图像的路径保存在数据库中?

Django 应用程序:必须将图像上传到的目录名称,应自动填充

使用 PHP 和单个 HTML 输入将多个图像上传到服务器和数据库[重复]

如何使用 javascript 将多个图像上传到 cloudinary 并将 url 发送到另一个数据库