当前位置: 首页 > 知识库问答 >
问题:

在ASP.NET MVC 3 C#中处理从HTML表单上载文件

壤驷敏学
2023-03-14

我在PHP中有丰富的经验,但对ASP.NET还是个新手。我在网上找到了一些教程,这些教程让我走了这么远,但是我现在遇到了一些问题。

所以总结一下我想要完成的,我有一个页面,我想让用户提交比赛参赛作品。我使用一个HTML表单来收集东西,如条目标题,描述,并希望允许他们能够提交一个图像代表他们的条目。

当他们选择提供图像时,我希望使用类似于://entry//entry-image的路径上传图像。

我的数据库将只保存一个表示图像路径的varchar。我还想给文件上传添加一些明显的验证,比如限制文件大小,只允许某些文件扩展名。图像应该用一些标准名称保存(如上面路径中的'entry-image'),覆盖可能已经在该条目目录中的任何图像。

现在,从HTML表单中获取文本输入不是问题,但获取文件却是问题。我目前还没有对表单进行验证,只是想让它在最基本的状态下工作。以下是我的HTML的截断版本:

<form method="post" action="../Entry/Create">
            <input type="text" id="EntryTitle" name="EntryTitle" />
            <p id="char-remaining">(100 characters remaining)</p>

            <input type="text" id="EntryVideo" name="EntryVideo" />
            <p id="vid-desc">(URL of the Video to Embed)</p>

            <input type="file" id="ImageFile" name="ImageFile" />
            <p id="file-desc">(200x200px, jpeg, png, gif)</p>

            <textarea id="EntryDesc" name="EntryDesc"></textarea>
            <p id="entry-desc"></p>
            <button id="new-entry-save">save</button>
</form>

下面是我在EntryController类中的创建操作:

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");
    }

你会注意到我有几行被注释掉了。如果没有注释,文本输入值就会很好地接收并存储在我的数据库中。但是,如果不加注释,则会在第一行注释掉的行上抛出NullReferenceException。

我在操作中使用的代码基本上是从教程中复制和粘贴的,我意识到如果它真的起作用,它就不能实现我上面写的目标,因为它没有检查文件扩展名或将文件名更改为标准的。

所以我的主要问题是:

1.)当我实际上在HTML表单上提供文件时,为什么会收到NullReferenceException?

2.)如何验证提交的文件?(大小、扩展名、尺寸等)

3.)如何将文件的名称更改为“entry-image”之类的?

共有2个答案

阴波峻
2023-03-14

如果还没有,请将enctype=“multipart/form-data”属性添加到表单元素中。

东方华晖
2023-03-14

下面是对上面第2条的回答:

对视图Submit操作调用JavaScript函数

<input type="submit" id="thePageSubmit" value="Upload" onclick="return IsValidExtention();" /> 

然后在Javascript fuinction中执行如下操作

    function IsValidExtention() {
        var it = document.forms[0].elements["ImageFile"].value;
        it = it.substring(it.lastIndexOf('\\') + 1);
        if (it.length > 0) {
            if (it.toLowerCase().indexOf(".exe")!=-1) {
                alert("We are unable to upload .exe files.");
                return false;
            }
            if (it.toLowerCase().indexOf(".js") != -1) {
                alert("We are unable to upload .js files.");
                return false;
            }
        }
        else{
            return false;
        } 
        return true;
    }
 类似资料:
  • 当解析器MultipartResolver完成处理时,请求便会像其他请求一样被正常流程处理。首先,创建一个接受文件上传的表单将允许用于直接上传整个表单。编码属性(enctype="multipart/form-data")能让浏览器知道如何对多路上传请求的表单进行编码(encode)。 <html> <head> <title>Upload a file please</t

  • Web API 2中的文件上载问题 虽然我上传文件与表单后此工作文件,但当我发送相同的信息从Rest客户端像邮递员在谷歌Chrome或张贴文件信息与Android或iOS应用程序Web Api 2代码不检测文件多部分/表格-员额 下面是我的html代码 这NETWebAPI 2代码 这是邮递员的要求 在Fiddler客户端中公开post请求时,我已经看到,当使用html表单post发布时,在多部分

  • 我有一个Azure函数,当一个blob被上传到某个目录时会被触发。它处理一个zip文件。当我用Azure storage explorer将文件上传到容器时,它工作得非常好。当我通过网络API上传它时,它爆炸了。如果我下载了这个文件,它似乎已经损坏,但是,它与源文件大小相同,当我在2个文件之间进行超越比较时,它看起来是相同的(超越比较似乎可以看到zip文件的内容)。 这里是上传代码: 文件可以很好

  • 我希望能够将图像上传到服务器,优雅地处理错误和异常,并在表单中向用户显示错误消息,并且理想情况下仅使用现有的准系统Spring Boot和Thymeleaf安装。 使用示例项目gs-上载文件,我可以使用Spring Boot和Thymeleaf将文件上载到服务器。在application.properties中,我设置了和。但是,当我上传大于1MB的文件时,几个安全和验证问题没有解决。 > 可以上

  • 表单是让用户与我们的网页应用程序交互的基本元素。Flask 本身并不会帮助我们处理表单,但是 Flask-WTF 扩展让我们在我们的 Flask 应用程序中使用流行的 WTForms 包。这个包使得定义表单和处理提交容易一些。 Flask-WTF 我们想要使用 Flask-WTF 做的第一件事情(在安装它以后)就是在 myapp.forms 包中定义一个表单。 # ourapp/forms.py

  • 我有一个javascript应用程序,它向某个URL发送ajax POST请求。响应可能是一个JSON字符串,也可能是一个文件(作为附件)。我可以很容易地在ajax调用中检测到内容类型和内容配置,但是一旦检测到响应包含文件,我如何提供客户端下载它呢?我在这里读过很多类似的文章,但没有一篇能提供我想要的答案。 请,请,请不要发布建议我不应该为此使用ajax或者我应该重定向浏览器的答案,因为这些都不是