ASPX:使用HTML Input type =“ file”时出错

时间:2019-01-23 10:43:53

标签: c# asp.net html5

我正在通过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);

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

3 个答案:

答案 0 :(得分:1)

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

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

现在,由于没有文件被发布,因此postedFile变量为null,因此,当您调用方法或访问此变量的属性时,它将引发null引用异常。就您而言,postedFile.FileName将在您的代码隐藏中导致此异常。

替代解决方案:

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

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

答案 1 :(得分:0)

请尝试使用此代码

//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;
}

答案 2 :(得分:0)

我将在这里使用的完整解决方案发布给也需要此功能的其他人。

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
    }
}