【问题标题】:Insert CSV from file upload control directly to memory stream without physical path将文件上传控件中的 CSV 直接插入内存流,无需物理路径
【发布时间】:2012-09-17 10:28:32
【问题描述】:

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

我想要做的是使用 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
    }
}

有什么想法吗?谢谢!

【问题讨论】:

    标签: asp.net csv memorystream


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这有帮助吗?

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

      MSDN FileUpload.FileContent Property

      【讨论】:

      • 这并没有真正帮助,因为我不想将文件保存到某个位置。它也在 .NET 4.5 中,我使用的是 4.0。
      【解决方案3】:

      //尝试下面的一种,从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;
                  }
              }
          }       
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        • 2020-11-13
        • 2021-06-18
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 2015-10-25
        相关资源
        最近更新 更多