【问题标题】:ASPX : Error while using HTML Input type="file"ASPX:使用 HTML 输入类型=“文件”时出错
【发布时间】:2019-06-16 22:26:13
【问题描述】:

我正在通过 HTML 输入 type="file" 创建一个带有“上传”控件的表单

这是我的html代码:

<form id="form1" runat="server" enctype="multipart/form-data">
    <div class="form-group">
        <asp:label ID="Label1" runat="server" For="message-text" class="col-form-label">Transaction Slip:</asp:label><br />
        <input type="file" name="FileUpload" class="btn btn-light" accept="image/*"/>
    </div>
</form>

后面的.cs代码如下:

protected void btnSubmit_Clicked(object sender, EventArgs e)
{
    HttpPostedFile postedFile = Request.Files["FileUpload"];
    string filePath = Server.MapPath("~/TransacSlip/") + Path.GetFileName(postedFile.FileName);
    postedFile.SaveAs(filePath);
}

但我收到以下错误:

“/”应用程序中的服务器错误。 对象引用未设置为对象的实例。

错误行:

第 78 行:字符串 filePath = Server.MapPath("~/TransacSlip/") + Path.GetFileName(postedFile.FileName);

有人知道如何解决这个问题吗? 非常感谢~

【问题讨论】:

  • @Izzy 您好,感谢您的回复。我已经通过使用 HTML 输入控件添加了一个图像,这意味着它不应该是 Null 值,所以如果说它真的检测到 Null 值,我可以知道如何让系统检测它的值,因为它已经有一个在我运行此代码以将图像存储在我的服务器路径中之前,html 输入中的图像
  • 你可以使用postedFile.ContentLength > 0 来检查文件是否存在,我的朋友:))
  • @TeoLawrence,检查我的答案。我提供了两种不同的方法,都可以解决您的问题。
  • @TeoLawrence,如果满足您的要求,请为所有人的利益标记答案。

标签: c# asp.net html


【解决方案1】:

runat="server"添加到类型文件控件的html输入中,如下面的代码所示,那么您将在代码隐藏中发布一个文件,否则Request.Files集合将在代码隐藏中为空。

<input type="file" name="FileUpload" class="btn btn-light" accept="image/*" runat="server"/>

现在因为没有文件被发布,所以postedFile变量为空,因此,当你调用一个方法或访问这个变量的一个属性时,它会抛出一个空引用异常。在您的情况下,postedFile.FileName 将在您的代码隐藏中导致此异常。

替代解决方案:

如果您不想使用runat="server" 属性来控制文件类型的输入,请确保页面中的表单将enctype 属性设置为multipart/form-data,如下面的代码所示。这也将解决您的问题。如果您遵循此方法,则无需添加 runat="server" 属性。

<form id="form1" runat="server" enctype="multipart/form-data">

【讨论】:

  • 嗨 Sunil,我上面的代码已经在
    使用 enctype="multipart/form-data" 了,不起作用,刚才我也尝试将 runat=server 放在输入控件上,也不行……
  • 看起来代码从输入控件获得了一个空值,但我实际上是在运行之前使用控件选择了一个图像(我也可以在控件上看到图片缩略图)“ btnSubmit_Clicked"
  • 您获得空值的原因是因为您缺少我的回答中提到的部分。当您单击提交按钮时,如果您使用 runat="server" 或按照我的回答中所述设置表单的 enctype 属性,则数据(即图像文件)将被提交到后端服务器。如果您不使用任何可能的解决方案,则只能在浏览器中看到图像,但不会发送到后端服务器。
  • 我解决了我的问题,这是因为我不小心在
    跨度>
  • 好的。伟大的。请记住,如果您使用 runat="server" 属性,那么您将不需要 encytype。此外,为输入文件元素提供 id 始终是一个好习惯。 id 不必与 name 属性相同。
【解决方案2】:

请试试这个代码

//Access the File using the Name of HTML INPUT File.
HttpPostedFile postedFile = Request.Files["FileUpload"];

//Check if File is available.
if (postedFile != null && postedFile.ContentLength > 0)
{
   //Save the File.
   string filePath = Server.MapPath("~/TransacSlip/") + Path.GetFileName(postedFile.FileName);
   postedFile.SaveAs(filePath);
   lblMessage.Visible = true;
}

【讨论】:

  • @Prashant Pimpale 我之前尝试过这段代码来判断控件是否有值,看起来代码从输入控件中获取了一个空值,但我实际上是通过使用运行“btnSubmit_Clicked”之前的控件(我也可以在控件上看到图片缩略图)
【解决方案3】:

我在这里为其他需要此功能的人发布了完整的解决方案。

HTML/ASP.Net 中的代码(记得输入 enctype="multipart/form-data")

<form id="form1" runat="server" enctype="multipart/form-data">
    <input type="file" name="FileUpload" class="btn btn-light" accept="image/*"/>
    <asp:Button ID="TestButton" runat="server" Text="Button" OnClick="TestButton_Clicked" />
</form>

代码背后 (c#)

使用 System.IO;

protected void TestButton_Clicked(object sender, EventArgs e)
{
    //To get the file from HTML Input File
    HttpPostedFile postedFile = Request.Files["FileUpload"];

    //String your relative folder path
    string folderPath = Server.MapPath("~/FolderName/");

    //Check if your folder is exist or not, if not then created folder automatically
    if (!Directory.Exists(folderPath))
    {
        Directory.CreateDirectory(folderPath);
    }

    //Check did your control have image uploaded
    if (postedFile != null && postedFile.ContentLength > 0)
    {
        //To prevent duplicated name (accidently replace), using GUID code to store your image
        string GUIDCode = System.Guid.NewGuid().ToString("N");
        string filePath = folderPath + GUIDCode + ".jpg";
        postedFile.SaveAs(filePath);
    }
    else if (postedFile == null && postedFile.ContentLength <= 0)
    {
        // Do your thing when control have no image uploaded
    }
}

【讨论】:

    猜你喜欢
    • 2010-12-30
    • 2016-10-06
    • 1970-01-01
    • 2018-09-20
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2015-03-18
    相关资源
    最近更新 更多