上传功能不起作用。 ASP.NET 页

Upload functionality not working. ASP.NET Page

所以基本上我试图从这篇文章 https://www.c-sharpcorner.com/UploadFile/5357ed/importingreadingexporting-of-csv-file-in-Asp-Net/ 中得到帮助,这样我就可以将上传功能添加到我的 asp.net 页面中,然后将我的 gridview 自定义为其他内容。主要是,我遵循了相同的代码并给了它 运行 查看是否一切正常,但我在 btn_import_Click 中收到文件路径错误。它吹是因为它找不到目录。这是示例中的第 85 行。

"System.IO.DirectoryNotFoundException: '找不到路径的一部分 'C:\inetpub\wwwroot\dir\dir\upload'.'""

我真的希望它指向实际文件的物理位置,因为我的用户将拥有不同的机器,而当他们拥有该 .csv 文件时,我们都不会使用同一台机器或目录。

如果你们能发光,我将不胜感激。我在 Java 中完成了这个没有问题,但是我在这个 ASP.NET 项目上遇到了困难。提前致谢!

我在这里很困惑。

该文件路径名是网络服务器路径名。那么一些网络服务器被托管在某个地方? 这与用户本地文件系统的关系为零。

您无法在客户端计算机 运行 浏览器上获取、查看、确定任何路径名。

当你up-load一个文件时,你只会得到文件名。

您无法从客户端抓取、获取、确定甚至设置文件名。

我的意思是,如果你访问我的网站是为了看一张猫的照片?

当你看着猫的照片时,我的代码无法开始在你的计算机上四处寻找,并说抓取一个名为 passwords.txt 的文件,或者一些名为我的银行文件的文件。

当您 up-load 时,您现在就拥有了该文件,并且可以将其保存在该网络服务器计算机上您想要的任何位置。但是,因此,这些路径名,甚至您选择使用的文件名与客户端计算机上的任何文件夹名或文件名都为零。出于安全原因,网络以这种方式工作。

您对路径名、文件名或客户端计算机上的任何内容的了解为零。

那么文件上传控件?

它让用户选择文件 - 不是你,不是你的代码,也不是你的 JavaScript 代码。您永远无法控制、设置、获取、更改甚至在代码中确定驱动器号、文件夹甚至文件名。用户客户端必须并且将选择该文件。然后 up-loaded.

届时,您可以随意将文件保存在任何文件夹中。在那个例子中,他们使用了一个名为“上传”的文件夹。您可以创建和命名并选择您想要的任何文件夹名称来代替名称“上传”文件夹。但是,该文件夹位于服务器端,与任何名称和客户端的任何文件夹都为零。

当用户 up-load 文件时,您永远不会收到文件夹名称。您只会得到一个文件名和文件数据。仅此而已,也没有什么是永远设置到您的服务器。

如果他们使用 Android phone 或 iPhone 会怎样?他们甚至没有标准的 windows 路径名。

现在,它的工作方式可能常常有点令人困惑,因为在开发过程中,您的一台计算机 运行 既有您的代码,又有您的文件系统,并且都有网络服务器 运行 在一台计算机上。

但是,一旦您发布该网站,则代码、网络服务器以及使用的文件夹和文件只能来自网络服务器端。您没有关于客户端文件系统的信息。连路径名都不能用,甚至不知道。

你得到一个文件名,你得到文件数据。此时,您可以保存到 Web 服务器上的任何文件夹。但因此,这些文件名、路径名、文件夹名 100% 在您的控制之下,最终用户对您作为开发人员选择用于您的 Web 服务器的文件夹一无所知。

因此,“上传”的路径名不在客户端计算机上,而只是在网络服务器端的路径名。

所以,你这么说很混乱:

the actual file since my users will have different machines and we all won't be using the same machine nor directories when they would have that .csv file.

但是您无法在您的网络服务器代码中知道该位置。用户必须去select那个文件,up-load到你的电脑运行你的网络服务器。您决定将该文件保存在何处是您的选择,而不是最终用户的选择。

您永远无法查看、看到或知道最终用户拥有哪些文件夹。允许最终用户使用 file-upload 的唯一任务是 select 他们计算机上的文件。但是,当他们这样做时,up-load?

那么在你的代码背后和网络服务器端呢?

你只得到一个文件名(没有路径信息),你只得到文件数据。您甚至无法更改它们 select 的文件名。在您的服务器和代码获取该文件后,您可以将该文件保存到 Web 服务器上的任何文件夹中。您甚至可以更改保存的文件的名称。

但是,您无法更改他们 select 编辑的文件,如果它来自您也无法更改,您甚至无法在 JavaScript 中更改、触摸或修改用户选择的文件。正如我所说,这是出于安全考虑。

关于文件所在位置的信息为零。您获得的唯一信息是文件名和文件数据。关于用户选择的文件的附加信息为零,甚至由您决定。

您对客户端使用的文件路径名和文件夹名一无所知。允许用户执行的唯一任务是选择文件。当文件选择器在浏览器中启动时,用户(不是你)可以 select 任何文件夹中的文件。当他们select那个文件时,然后文件名和数据被发送到服务器。但不是路径名 - 只有文件和数据。

您对用户路径名的了解为零。因此,您的代码和假设必须基于这个简单的事实和限制。

编辑:上传一个文件, 处理到网格

好的,所以我们在这里所做的就是上传一个文件 (csv),然后我们处理文件的每一行,然后我们将其显示在 gridview 中。

因此我们假设我们的项目中有一个名为 UpLoadFiles 的文件夹。

因此,页面上的标记可能是这样的

A FileUpLoad control.
A button to up-load the selected file, and then process to grid
A gridview control.

所以,说这个标记:

        <asp:FileUpload ID="FileUpload1" runat="server" />

        <asp:Button ID="cmdUpLoad" runat="server" Text="Process csv"  CssClass="btn" OnClick="cmdUpLoad_Click"/>

        <asp:GridView ID="GridView1" runat="server" CssClass="table"></asp:GridView>

好的,用户 select 使用 Fileupload 上传文件,然后点击按钮。

我们的代码可能是这样的:

我们保存文件(到文件夹 UpLoadFiles)。

然后我们将 csv 文件转换为数据表。

然后我们处理一些行。在此示例中,我们采用任何缺少值的 City 列和 Province 列 - 并加入我们的文本。

我们再发送到上面的grid viewe。

按钮的代码如下所示:

-- 我们使用了 MicrosoftVisual basic csv 解析器

因此,设置对此的引用:

然后现在

using Microsoft.VisualBasic.FileIO;
using System.Data;

好的,我们的按钮代码:

    protected void cmdUpLoad_Click(object sender, EventArgs e)
    {
        // save file to up-loads folder
        string sFileLocal = Server.MapPath(@"~/UpLoadFiles/" + FileUpload1.FileName);

        FileUpload1.SaveAs(sFileLocal);

        // process csv file
        TextFieldParser MyParse = new TextFieldParser(sFileLocal);
        MyParse.TextFieldType = FieldType.Delimited;
        MyParse.SetDelimiters(new string[] { "," });
        MyParse.HasFieldsEnclosedInQuotes = true;

        DataTable rstData = new DataTable();
        foreach (string cCol in MyParse.ReadFields())
        {
            rstData.Columns.Add(cCol);
        }
        while (!MyParse.EndOfData)
        {
            string[] OneRow = MyParse.ReadFields();
            rstData.Rows.Add(OneRow);
        }

        // example process each row of  data
        foreach (DataRow OneRow in rstData.Rows)
        {
            if (OneRow["City"].ToString() == "")
                OneRow["City"] = "No City";

            if (OneRow["Province"].ToString() == "")
                OneRow["Province"] = "No Province";
        }

        // Now display results in a grid
        GridView1.DataSource = rstData;
        GridView1.DataBind();
    }

我们的输出如下所示:

请不要反驳我。正如我所说,在这一点上我更熟悉 Java 并且一些 Asp.NET 就这样做而言。

我根据另一个例子发现了我的问题: https://findnerd.com/list/view/How-to-read-CSV-file-in-asp-net/19762/

如果您从上面的第 11 行看 link,他们使用的是以下内容:

字符串路径=Path.GetFullPath(filename.PostedFile.FileName);

这是给我的。我把它当作

字符串路径 = Server.MapPath("~/Files/") + Path.GetFileName(filename.PostedFile.FileName);

据我所知,Server.MapPath 没有用,但 Path.GetFullPath 有用。我的程序读取文件并将其保存到数据表中。然后我将数据 table 绑定到 gridview 的数据源,瞧,我看到了来自 csv 文件的数据。

我想回来回答一下,以防其他人遇到同样的情况 运行。如果有人愿意解释 Server.MapPath 和 Path.GetFullPath 之间的区别,那就太好了。这将为该主题添加更多解释。

谢谢大家,问候! ^_^