MVC4 C#-想要将图像保存到文件夹并将url保存在数据库中

本文关键字:保存 url 存在 数据库 文件夹 C#- 图像 MVC4 | 更新日期: 2023-09-27 18:12:29

我对MVC4编码很陌生。以前在SharePoint中编程。

我遇到的问题是,我想将图像保存到特定的文件夹(比如App_Data(,并将图像的url保存到数据库中的字符串中。如果有人能帮我解决这个问题,那就太好了。

我现在得到的代码是.

型号>ImageUpload.cs

public class ImageUpload
{
    public int ID { get; set; }
    public string Title { get; set; } 
    public string Url { get; set; }
}
public class ImageUploadDBContext : DbContext
{
    public DbSet<ImageUpload> ImageUploads { get; set; }
}

控制器>ImageUploadController.cs

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(ImageUpload imageupload)
    {
        if (ModelState.IsValid)
        {
            db.ImageUploads.Add(imageupload);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(imageupload);
    }
[HttpPost]
    public ActionResult Upload(HttpPostedFileBase[] files)
    {
        foreach (HttpPostedFileBase file in files)
        {
            string picture = Path.GetFileName(file.FileName);
            string path = Path.Combine(Server.MapPath("~/App_Data"), picture);
            string[] paths = path.Split('.');
            string time = DateTime.UtcNow.ToString();
            time = time.Replace(" ", "-");
            time = time.Replace(":", "-"); 
            file.SaveAs(paths[0] + "-" + time + ".jpg");
        }
        ViewBag.Message = "File(s) uploaded successfully";
        return RedirectToAction("Index");
    }

查看>图像上传>Index.chtml

@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Url)
        </th>
        <th>
            Preview
        </th>
        <th></th>
    </tr>
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Url)
            </td>
            <td>
                <img border="0" src="@Html.DisplayFor(modelItem => item.Url)" alt="@Html.DisplayFor(modelItem => item.Title)">
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })
            </td>
        </tr>    
    }
</table>

查看>图像上传>创建.cshtml

@{
    ViewBag.Title = "Create";
}
<h2>Create</h2>
@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>ImageUpload</legend>
            @using (Html.BeginForm())
            {
                    <div class="editor-label">
                        <b>@Html.LabelFor(Model => Model.Title)</b>
                    </div>
                    <div class="editor-field">
                        @Html.EditorFor(Model => Model.Title)
                        @Html.ValidationMessageFor(Model => Model.Title)
                    </div>
                    <div class="editor-label">
                        <b>@Html.LabelFor(Model => Model.Url)</b>
                    </div>
                    <div>
                        @Html.EditorFor(Model => Model.Url)
                        <input type="file" name="files" value="" multiple="multiple"/>
                    </div>
                    <div>
                        <input type="submit" value="Submit" />
                    </div>
            }

    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

MVC4 C#-想要将图像保存到文件夹并将url保存在数据库中

对于文件上传,您可以使用此代码。保存到文件夹的图像和存储到数据库的文件名:

控制器内:

[HttpPost]
public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file)
{ 
   if (ModelState.IsValid)
   {
      var filename = Path.GetFileName(file.FileName);
      var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename);
      file.SaveAs(path);
      tyre.Url = filename;
      _db.EventModels.AddObject(eventmodel);
      _db.SaveChanges();
      return RedirectToAction("Index");
   }
   return View(eventmodel);
}

和视图:

<div>
   Image
   <input type="file" name="file" id="file" />
   @Html.HiddenFor( model => model.ImageUrl)
   @Html.ValidationMessageFor( model => model.Url )
</div>

将这两个方法组合成一个方法逻辑,代码应该是这样的:

[HttpPost]
[ValidateAntiForgeryToken]
    public ActionResult Upload(HttpPostedFileBase[] files)
    {
        // try to save the file
        foreach (HttpPostedFileBase file in files)
        {
            string picture = Path.GetFileName(file.FileName);
            string path = Path.Combine(Server.MapPath("~/App_Data"), picture);
            string[] paths = path.Split('.');
            string time = DateTime.UtcNow.ToString();
            time = time.Replace(" ", "-");
            time = time.Replace(":", "-"); 
            file.SaveAs(paths[0] + "-" + time + ".jpg");
        }
        // try to save the new file name to db now.
        try
        {
            db.ImageUploads.Add(paths[0] + time + ".jpg");
            db.SaveChanges();
        }
        catch(Exception ex)
        {
             ..........
        }
        ViewBag.Message = "File(s) uploaded successfully";
        return RedirectToAction("Index");
    }

在控制器操作中,您需要执行HTTP请求以从远程服务器获取图像:

public ActionResult Thumb(int id)
{
    using (var client = new WebClient())
    {
        byte[] image = client.DownloadData("http://cdn.foo.com/myimage.jpg");
        return File(image, "image/jpg");
    }
}

然后:

<img src="@Url.Action("Thumb")" alt="" />

很明显,现在图像被下载了两次。一次从CDN进入控制器,一次从客户端进入。这完全违背了控制器操作的目的,您可以直接引用CDN中的图像:

<img src="http://cdn.foo.com/myimage.jpg" alt="" />

这显然是假设客户端可以访问CDN。

当然,如果你的控制器操作不仅仅是从CDN中获取图像并将其流式传输到客户端,比如从CDN中提取图像并调整其大小,那么你肯定应该采取第一种方法。

来源:stackoverflow