在ASP.net MVC 3 C#中保存HTML表单中的图像

本文关键字:保存 HTML 图像 表单 ASP net MVC | 更新日期: 2023-09-27 18:30:06

我希望有人能修改下面的代码,向我展示如何让它做我想做的事情。

我有一个HTML表单,它发布到以下操作:

public ActionResult Create(string EntryTitle, string EntryVideo, HttpPostedFileBase ImageFile, string EntryDesc)
    {
        if (Session["User"] != null)
        {
            User currentUser = (User)Session["User"];
            string savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(ImageFile.FileName)); 
            ImageFile.SaveAs(savedFileName);
            Entry newEntry = new Entry();
            newEntry.Title = EntryTitle;
            newEntry.EmbedURL = EntryVideo;
            newEntry.Description = EntryDesc;
            newEntry.ImagePath = savedFileName;
            newEntry.UserId = currentUser.UserId;
            db.Entries.Add(newEntry);
            db.SaveChanges();

        }
        return RedirectToAction("MyPage", "User");
    }

这会将映像保存到根解决方案目录(或者尝试保存,但没有权限,而是抛出异常)。

我想让它做以下事情:

1.)验证文件大小是否低于某个最大值,假设现在是500kb

2.)假设文件大小可以,将其保存到以下目录

mywebsite.com/uploads/<userid>/<entryid>/entry-image.<jpg/png/gif>

我不确定如何重命名文件,因为我想接受不同的文件扩展名(.jpeg、.jpg、.png、.gif)。或者不确定如何将其放入如上所述的正确目录。或者如何验证文件大小,因为显然只有当用户使用IE.

在ASP.net MVC 3 C#中保存HTML表单中的图像

时,您才能使用javascript进行验证

1.验证文件大小是否在某个最大值以下,假设现在是500kb

您可以使用HttpPostFileBase.ContentLength属性来获取文件的大小(以字节为单位)。

if (ImageFile.ContentLength > 1024 * 500) // 1024 bytes * 500 == 500kb
{
    // The file is too big.
}

2.假设文件大小可以,将其保存到以下目录

string savedFileName = Server.MapPath(string.Format("~/uploads/{0}/{1}/entry-image{2}",
    currentUser.UserId,
    newEntry.EntryId,
    Path.GetExtension(ImageFile.FileName)));

我看到的唯一问题是,它看起来像是你的Entry.EntryId可能是在数据库中生成的,所以在生成它之前,你不能将它用作保存路径的一部分。

希望这有助于或至少为您指明正确的方向

    if (ImageFile.ContentLength < 1024 * 500)
            {
                Entry newEntry = new Entry();
                newEntry.Title = EntryTitle;
                newEntry.EmbedURL = EntryVideo;
                newEntry.Description = EntryDesc;
                newEntry.UserId = currentUser.UserId;
                db.Entries.Add(newEntry);
                db.SaveChanges();  //this helps generate an entry id
                string uploadsDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "uploads");
                string userDir = Path.Combine(uploadsDir, <userid>);
                string entryDir = Path.Combine(userDir, newEntry.EntryID );
                if (Directory.Exists(userDir) == false)
                    Directory.CreateDirectory(userDir);
                if (Directory.Exists(entryDir) == false)
                    Directory.CreateDirectory(entryDir);
               string savedFileName = Path.Combine(entryDir, <entry-image>);
               ImageFile.SaveAs(savedFileName);
               newEntry.ImagePath = savedFileName;  //if this doesn't work pull back out this entry and adjust the ImagePath
               db.SaveChanges();
            }

您应该授予"uploads"目录的写入权限。

您还可以从web.config 限制web应用程序的文件大小

    <system.web>
       <httpRuntime   maxRequestLength="500"/>