3

我不确定这是否可能,所以很高兴能得到一些帮助。

我想要做的是使用 asp.net 中的文件上传控件来选择一个 csv 文件。然后使用页面上的提交按钮运行我的服务器端代码,该代码将获取该 csv 文件并将其放入内存流中,在那里将对其进行解析,然后将其添加到集合对象中。

我确实知道将 csv 文件保存到物理路径然后在删除文件的地方进行某种清理会更容易,但如果可能的话,我想这样做。

到目前为止,请参见下面的代码:

protected void btnUpload_Click(object sender, EventArgs e)
    {
        string connectingString = "";
        if (ctrlFileUpload.HasFile)
        {
            string fileName =
                Path.GetFileName(ctrlFileUpload.PostedFile.FileName);

            string fileExtension =
                Path.GetExtension(ctrlFileUpload.PostedFile.FileName);

            ReadCsv(fileName);
        }
    }

protected void ReadCsv(string fileName)
    {
        // Some logic for parsing csv file in memory stream
    }
}

有任何想法吗?谢谢!

4

3 回答 3

2

我知道这是一个老问题,但下面的代码可以使用 a 将您发布的文本文件读入内存流StreamReader,并且与 .NET 4.0 兼容:

protected void ReadCsv()
{
    StreamReader reader = new StreamReader(ctrlFileUpload.PostedFile.InputStream);
    string content = reader.ReadToEnd();
}

请注意,仅当服务器上有足够的内存来同时为多个用户处理较大的文件时,此方法才有效。如果您有数百个用户同时将文件发布到内存流并由于可用内存不足而导致服务器崩溃,您不希望使用这种方法。如果您在共享托管环境中,您还需要检查这是否是可接受的方法。

于 2013-05-29T14:41:10.103 回答
0

这有帮助吗?

这应该给你流。因此,您可以让您的ReadCsv方法接受对流的引用,并将其传递给它而不是文件名,然后对流进行处理。

MSDN FileUpload.FileContent 属性

于 2012-09-17T10:32:55.597 回答
0

//尝试下面一种从FileUpload Control捕获MemoryStream中的数据

  protected void btnFileUpload_Click(object sender, EventArgs e)
    {
        if (FileUploadControl.HasFile)
        {
            try
            {                 
                #region Capture file data in Memory Stream

                byte[] fileData = null;
                Stream fileStream = null;
                int length = 0;

                length = FileUploadControl.PostedFile.ContentLength;
                fileData = new byte[length + 1];
                fileStream = FileUploadControl.PostedFile.InputStream;
                fileStream.Read(fileData, 0, length);

                //Use MemoryStream to capture file data
                MemoryStream stream = new MemoryStream(fileData);

                Session["FileUploaded"] = stream;

                #endregion

                StreamReader strFile;                 

                using (strFile = new StreamReader(stream))
                {
                    string line;
                    DataTable dtStudentData = CreateDataTable();
                    DataRow drStudentRow;
                    List<String> errorMessages = new List<String>();
                    // Read and display lines from the file until the end of the file is reached. 
                    while ((line = strFile.ReadLine()) != null)
                    {
                        if (line.Trim().Length > 0)
                        {
                            System.Threading.Thread.Sleep(1000);
                            string[] columns = line.Split('\t'); //splitting the line which was read by the stream reader object                                  

                            Int32 charpos = (Int32)strFile.GetType().InvokeMember("charPos", BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField, null, strFile, null);

                            Int32 charlen = (Int32)strFile.GetType().InvokeMember("charLen",
                            BindingFlags.DeclaredOnly |
                            BindingFlags.Public | BindingFlags.NonPublic |
                            BindingFlags.Instance | BindingFlags.GetField
                             , null, strFile, null);

                            int lineno = (Int32)strFile.BaseStream.Position - charlen + charpos;                                

                            //Add data row in Data Table
                            drStudentRow = dtStudentData.NewRow();  
                            // TO DO code - Fill data table
                            dtStudentData.Rows.Add(drStudentRow);
                        }                            
                    }
                    strFile.Dispose();
                    dtStudentData.Rows.RemoveAt(0); //Remove the first column since its the column name not necessary to insert in the database table
                    PopulateStudentInvalidDataGridView(dtStudentData);    // Bind Grid                    
                    Session["StudentData_FileParsedStudentRegistrtaionTable"] = dtStudentData;
                    strFile.Close(); //release the stream reader                        
                }
            }
            catch (Exception ex)
            {
                String error = ex.Message;
            }
        }
    }       
于 2014-09-03T06:13:31.767 回答