我有一个关于使用ASP.NET MVC将文件上传到SQL数据库的问题 这是我要存储图像的表格:
表“可交付成果”
- item_id
- deliverable_image
item_id来自另一个表,我存储了图像的名称,描述,标签......!
这是我的DeliverableController的创建视图:
@model GDMfrontEnd.Models.DeliverableViewModel
@{ ViewBag.Title = "Create"; } <h2>Create</h2> @using (Html.BeginForm()) { @Html.ValidationSummary(true) <fieldset> <legend>EventViewModel</legend> <div class="editor-label"> @Html.LabelFor(model => model.Title) </div> <div class="editor-field"> @Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title) </div> <div class="editor-label"> @Html.LabelFor(model => model.Description) </div> <div class="editor-field"> @Html.EditorFor(model => model.Description) @Html.ValidationMessageFor(model => model.Description) </div> <div class="editor-label"> @Html.LabelFor(model => model.Thumbnail) </div> <div class="editor-field"> <!-- @Html.EditorFor(model => model.Thumbnail) @Html.ValidationMessageFor(model => model.Thumbnail) --> <form action="/profile/upload" method="post" enctype="multipart/form-data"> <label for="photo">Photo:</label> <input type="file" name="photo" id="photo" /> <input type="submit" value="Upload" /> </form> </div> <div class="editor-label"> @Html.LabelFor(model => model.Image) </div> <div class="editor-field"> @Html.EditorFor(model => model.Image) @Html.ValidationMessageFor(model => model.Image) </div> <div class="editor-label"> @Html.LabelFor(model => model.VideoUrl) </div> <div class="editor-field"> @Html.EditorFor(model => model.VideoUrl) @Html.ValidationMessageFor(model => model.VideoUrl) </div> <p> <input type="submit" value="Create" /> </p> </fieldset> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") @Scripts.Render("~/bundles/jqueryui") @Styles.Render("~/Content/themes/base/css") </script> }
My DeliverableViewModel如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
namespace GDMfrontEnd.Models
{
public class DeliverableViewModel
{
[Required]
[Display(Name = "Title")]
public string Title { get; set; }
[Required]
[Display(Name = "Description")]
public string Description { get; set; }
[Required]
[Display(Name = "Thumbnail")]
public byte[] Thumbnail { get; set; }
[Required]
[Display(Name = "Image")]
public byte[] Image { get; set; }
[Required]
[Display(Name = "VideoUrl")]
public string VideoUrl { get; set; }
public long UsernameID { get; set; }
}
}
这是我的连接字符串:
<connectionStrings>
<add name="gdmwebsiteEntities" connectionString="metadata=res://*/Models.DBModel.csdl|res://*/Models.DBModel.ssdl|res://*/Models.DBModel.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;User Id=root;database=gdmwebsite"" providerName="System.Data.EntityClient" />
</connectionStrings>
但是如何上传文件而不仅仅是文字呢? 我已经完成了一些教程,但没有一个非常清楚,它们都不适用于MySQL数据库。
尼尔斯
答案 0 :(得分:1)
要完成你想要的,不管我不喜欢在DB中保存字节数组
首先更改在表单中添加以下参数,这样可以发送图像
@using (Html.BeginForm(null,null ,new { @enctype= "multipart/form-data"}))
将模型中映射的两个属性从字节数组修改为类型HttpPostedFileBase
public HttpPostedFileBase Image { get; set; }
public HttpPostedFileBase Thumbnail { get; set; }
在视图中添加属性,如
@Html.TextboxFor(model => model.Thumbnail, new {type="file"})
@Html.TextboxFor(model => model.Image , new {type="file"})
删除不应有两个嵌套表单的内部表单
现在,当您收到可以使用SaveAs方法保存的值或转换为字节数组
时model.Image.SaveAs();
了解更多信息here's the doc
答案 1 :(得分:0)
这对我有用:
MemoryStream target = new MemoryStream();
model.Image.InputStream.CopyTo(target);
byte[] data = target.ToArray();