文件上传MVC 4的问题

时间:2013-05-12 12:47:49

标签: asp.net asp.net-mvc razor

我的文件上传存在问题。 这是我的控制器

    public class StoreManagerController : Controller
    {
    private StoreContext db = new StoreContext();

    //Some actions here

    //
    // POST: /StoreManager/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Book book, HttpPostedFileBase file)
    {
        if (ModelState.IsValid)
        {
            book.CoverUrl = UploadCover(file, book.BookId);
            db.Books.Add(book);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.AuthorId = new SelectList(db.Authors, "AuthorId", "Name", book.AuthorId);
        ViewBag.GenreId = new SelectList(db.Genres, "GenreId", "Name", book.GenreId);
        ViewBag.PublisherId = new SelectList(db.Publishers, "PublisherId", "Name", book.PublisherId);
        return View(book);
    }

    private string UploadCover(HttpPostedFileBase file, int id)
    {
        string path = "/Content/Images/placeholder.gif";
        if (file != null && file.ContentLength > 0)
        {

            var fileExt = Path.GetExtension(file.FileName);
            if (fileExt == "png" || fileExt == "jpg" || fileExt == "bmp")
            {
                var img = Image.FromStream(file.InputStream) as Bitmap;
                path = Server.MapPath("~/App_Data/Covers/") + id + ".jpg";
                img.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
        }

        return path;
    }
}

我的创建视图

@using (Html.BeginForm("Create", "StoreManager", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
    @/* divs here */@
    <div class="editor-label">
        Cover
    </div>

    <div class="editor-field">
        <input type="file" name="file" id="file"/>
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Description)
    </div>

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

}

当我尝试上传文件时,我有一个默认的占位符。所以我认为帖子数据是空的。 但是当我用浏览器检查它时,我得到了下一个帖子数据

------WebKitFormBoundary5PAA6N36PHLIxPJf
Content-Disposition: form-data; name="file"; filename="1.JPG"
Content-Type: image/jpeg

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我能看到的第一件事是错的是有条件的:

if (fileExt == "png" || fileExt == "jpg" || fileExt == "bmp")

这永远不会返回true,因为Path.GetExtension包含'。'在文件扩展名中。听起来这可能是你的主要问题,因为这将简单地跳过条件块,你将留下你的占位符。这需要更改为:

if (fileExt == ".png" || fileExt == ".jpg" || fileExt == ".bmp")

但是,你的问题中有太多代码,很难确定这是否是唯一的问题。

如果您仍有问题,我建议您在控制器操作中放置一个断点(您尚未指定是Edit还是Create并检查file的值是否为{{1}}正如预期的那样。你应该能够找出问题所在的位置 - 如果你仍然无法解决问题 - 至少可以将你的问题缩小一点。