ASPX: ошибка при использовании ввода HTML type = "file" - PullRequest
0 голосов
/ 23 января 2019

Я создаю форму с элементом управления «Upload» с помощью ввода 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 (postsFile.FileName);

Кто-нибудь знал, как решить эту проблему? Большое спасибо ~

Ответы [ 3 ]

0 голосов
/ 23 января 2019

Пожалуйста, попробуйте этот код

//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;
}
0 голосов
/ 23 января 2019

Я публикую полное решение, которое я использовал здесь для других людей, которым также нужна эта функция.

Код в 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
    }
}
0 голосов
/ 23 января 2019

Добавьте runat="server" к вводу html элемента управления типом файлов, как показано в приведенном ниже коде, тогда у вас будет опубликованный файл в коде, иначе коллекция Request.Files будет пустой в коде позади.

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

Прямо сейчас, поскольку никакие файлы не публикуются, переменная postsFile имеет значение null, и поэтому, когда вы вызываете метод или обращаетесь к свойству этой переменной, она выдаст исключение нулевой ссылки. В вашем случае postedFile.FileName вызовет это исключение в вашем коде позади.

Альтернативный раствор:

Если вы хотите не использовать атрибут runat="server" для управления вводом типа файла, убедитесь, что ваша форма на странице имеет атрибут enctype, установленный на multipart/form-data, как в коде ниже. Это также решит вашу проблему. Вам не нужно добавлять атрибут runat = "server", если вы придерживаетесь этого подхода.

<form id="form1" runat="server" enctype="multipart/form-data">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...