将文件上载控件中的CSV直接插入到没有物理路径的内存流中

时间:2012-09-17 10:28:32

标签: asp.net csv memorystream

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

我想要做的是在asp.net中使用fileupload控件来选择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
    }
}

有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

这有帮助吗?

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

MSDN FileUpload.FileContent Property

答案 2 :(得分:0)

//尝试使用低于1来从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;
            }
        }
    }