将照片上传到 MVC 4 应用程序

2024-04-16

我正在尝试创建一个控制器来在我的 MVC4 应用程序中上传照片。但我不断收到此错误。输入不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符或填充字符中包含非空白字符。

照片控制器.cs

 public class PhotoController : Controller
    {
        public ActionResult Index()
        {
            using (var ctx = new BlogContext())
            {
                return View(ctx.Photos.AsEnumerable());
            }
        }

        public ActionResult Upload()
        {
            return View(new Photo());
        }

        [HttpPost]
        public ActionResult Upload(PhotoViewModel model)
        {
            var photo = Mapper.Map<PhotoViewModel, Photo>(model);
            if (ModelState.IsValid)
            {
                PhotoRepository.Save(photo);
                return RedirectToAction("Index");
            }
            return View(photo);
        }
    }

Photo.cs

public class Photo
    {
    public int Id { get; set; }

    public Byte[] File { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public string AlternateText { get; set; }
    }

PhotoViewModel.cs

public class PhotoViewModel
    {
        public int Id { get; set; }

        public HttpPostedFileBase File { get; set; }

        public string Name { get; set; }

        public string Description { get; set; }

        public string AlternateText { get; set; }
    }

/照片/Upload.cshtml

 @model Rubish.Models.Photo

    @{
        ViewBag.Title = "Upload";
    }

    <h2>Upload</h2>

    @using (Html.BeginForm("Upload","Photo",FormMethod.Post,new {enctype="multipart/form-data"})) {
        @Html.ValidationSummary(true)

        <fieldset>
            <legend>Photo</legend>

            <div class="editor-label">
                @Html.LabelFor(model => model.Name)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Name)
                @Html.ValidationMessageFor(model => model.Name)
            </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">
                <label for="file">FileName:</label>
            </div>
            <div class="editor-field">
                <input name="File" id="File" type="file"/>
            </div>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    }

    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>

    @Scripts.Render("~/bundles/jqueryval")

照片库

public class PhotoRepository 
    {
        private static BlogContext _ctx;

        public PhotoRepository()
        {
            _ctx = new BlogContext();
        }

        public static void Save(Photo p)
        {
            _ctx.Photos.Add(p);
            _ctx.SaveChanges();
        }
    }

问题是你的视图模型中有一个名为File这是类型byte[]并且您还使用了一个名为的操作参数file类型的HttpPostedFileBase。问题是,当模型绑定程序遇到模型类型的属性时byte[]它尝试使用 base64 绑定请求值中的值。除了在请求中你有一个multipart/form-data上传文件的编码值,您会得到一个异常。

解决此问题的正确方法是使用视图模型,而不是将域模型传递给视图:

public class PhotoViewModel
{
    public HttpPostedFileBase File { get; set; }

    ... other properties
}

控制器操作现在将变为:

[HttpPost]
public ActionResult Upload(PhotoViewModel model)
{
    if (ModelState.IsValid)
    {
        // map the domain model from the view model that the action
        // now takes as parameter
        // I would recommend you AutoMapper for that purpose
        Photo photo = ... 

        // Pass the domain model to a DAL layer for processing
        Repository.Save(photo);

        return RedirectToAction("Index");
    }
    return View(photo);
}

我完全不推荐的糟糕方法是重命名文件输入来欺骗模型绑定器:

<input name="PhotoFile" id="File" type="file"/>

和你的控制器操作:

[HttpPost]
public ActionResult Upload(Photo photo, HttpPostedFileBase photoFile)
{
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将照片上传到 MVC 4 应用程序 的相关文章

随机推荐

  • 如何在 FactoryGirlRails 中定义序列?

    以前在 Factory Girl 中 我们可以像这样定义序列 spec factories rb FactoryGirl define do this is the sequence in question sequence random
  • vscode api:如何从文件图标主题获取图标

    我正在为 VSCode 编写一个扩展 在 WebviewPanel 中 我需要显示来自文件图标主题的文件扩展名图标 有没有从文件图标主题中获取图标的功能 我也在研究这个 我还没有答案 但到目前为止已经有了一些线索 希望这可以帮助 https
  • Perl 调用带括号和不带括号的方法

    一些 Perl 书籍建议在调用类方法时使用括号 称这有助于使解析器不必猜测代码的意图 然而 我见过的几乎所有 Perl 代码 包括 cpan 上的模块 在调用不带参数的方法时很少使用括号 省略这些括号是正常的还是我应该总是输入它们 我编写了
  • Keras:使用 flow_from _directory() 函数为两个输入模型创建自定义生成器

    我试图用以下方法训练我的暹罗网络fit generator 我从这个答案中了解到 Keras 如何将 fit generator 与多个输入一起使用 https stackoverflow com questions 49404993 ke
  • 通过实施 Web 服务向 Alexa 托管自定义技能

    我正在开发一个网络服务 用于处理 Alexa 发送的请求并在 net 框架中以特定响应进行响应 Alexa 以 JSON 格式发送到您的服务的请求正文 如下所示 version string session new true session
  • 使用AppService的连接持续时间有限制吗?

    我有一个 UWP 应用程序托管应用服务 https learn microsoft com en us windows uwp launch resume how to create and consume an app service在同
  • Pyspark 错误:Java 网关进程在发送其端口号之前退出

    我正在使用 Pyspark 在 Jupyter Notebook 中运行一些命令 但它抛出错误 我尝试了此链接中提供的解决方案 Pyspark 异常 Java 网关进程在向驱动程序发送其端口号之前退出 https stackoverflow
  • /usr/bin/ld: 找不到 -llibeststring.a

    我在我的程序中使用 Festival TTS C API 我已经从以下位置下载了所有文件http www cstr ed ac uk downloads festival 2 0 95 http www cstr ed ac uk down
  • Python urllib2.urlopen() 很慢,需要更好的方法来读取多个 url

    正如标题所示 我正在开发一个用 python 编写的网站 它多次调用 urllib2 模块来读取网站 然后我用 BeautifulSoup 解析它们 由于我必须阅读 5 10 个网站 因此页面需要一段时间才能加载 我只是想知道是否有办法一次
  • 在 iOS 5 中播放视频

    我正在尝试遵循本教程link http www techotopia com index php Video Playback from within an iOS 5 iPhone Application 但我有问题 有人可以看一下并让我
  • oracle pl/sql中的XML解析

    我正在尝试在 PL SQL 中解析此 XML
  • 在 WHERE 中使用 ROW_NUMBER() 别名[重复]

    这个问题在这里已经有答案了 在 Postgresql 9 1 中 我尝试使用 ROW NUMBER 别名字段过滤 WHERE 子句中的结果集 这个查询工作正常 SELECT inv client pk inv invoice pk inv
  • 监听来自UIWebView的所有请求

    我可以使用以下方法拦截来自 UIWebView 的初始加载请求 BOOL webView UIWebView webView shouldStartLoadWithRequest NSURLRequest request navigatio
  • 在 Javascript 中声明函数最有效的方法是什么?

    我一直了解到 要在 javascript 中声明函数 您应该执行以下操作 function myfunction fruit alert I like fruit 或类似的东西 var myfunction function fruit a
  • 如何获取子 ng-repeat 内父作用域数组/ng-repeat 的索引

    我正在建一张桌子 我有两张桌子ng repeat为了我的桌子 我的问题是 这是否有可能是ng repeat可以得到父级ng repeat的索引 例如 tbody tr td company the company index and pro
  • 为什么 Google 的 OpenID 实现的 ID 会发生变化?

    我正在尝试为 Web 应用程序实现 OpenId 登录 每当新用户通过 OpenId 登录时 我都会在系统上创建一个新用户 并在数据中存储他们的 openid URL 以便下次他们使用该用户登录时 我正在使用 Gmail OpenID 对此
  • 如何为armv6、armv7和i386编译静态库(fat)

    我知道这个问题已经被提出过好几次了 但我的目标与我在网上搜索到的内容略有不同 具体来说 我已经能够为 iPhone 构建静态库 但我能够构建的最终 fat 文件仅包含arm和i386架构 并且我不确定arm指的是 v6还是v7 我无法专门针
  • C++ 中谓词是什么? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 您能举一些例子或主题链接吗 谓词是一
  • Jquery中的onclick函数不起作用

    在product showcase js 文件的帮助下 我将内容加载到 HTML 中 然后使用以下类单击产品链接即内在我正在尝试组织一个单击事件如product description js所示 数据是从 json 文件中获取的 我能够将数
  • 将照片上传到 MVC 4 应用程序

    我正在尝试创建一个控制器来在我的 MVC4 应用程序中上传照片 但我不断收到此错误 输入不是有效的 Base 64 字符串 因为它包含非 Base 64 字符 两个以上的填充字符或填充字符中包含非空白字符 照片控制器 cs public c