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

これは古い質問であることは承知していますが、以下のコードは、投稿されたテキスト ファイルをメモリ ストリームに読み込むために機能し、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 コントロールから MemoryStream にデータをキャプチャするために、1 つ以下を試してください

  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 に答える