6

おはようございます-HttpPostedFileBase(常に単純なCSVファイルになります)を次のようなセッション変数に保存しようとしています。

    [HttpPost]
    public ActionResult Index(HttpPostedFileBase importFile) {
        Session.Remove("NoteImport");
        var noteImport = new NoteImport { ImportFile = importFile, HeaderList = NoteService.HeaderList(importFile) };
        Session["NoteImport"] = noteImport;
        return RedirectToAction("FileNote");

    }

ご覧のとおり、importFileをNoteImportクラスにダンプしています。現在、ImportFileプロパティは、公的にアクセス可能なHttpPostedFileBaseタイプです。

サービス(ヘッダー値のリストを作成するメソッド)でこのプロパティを初めて使用するときは、問題はありません。

    public List<string> HeaderList(HttpPostedFileBase fileStream) {
        var sr = new StreamReader(fileStream.InputStream);
        var headerString = sr.ReadLine();
        var headerArray = headerString.Split(',');
        var headerList = new List<string>();
        foreach (var header in headerArray) {
            if (!ValidateHeader(header))
                throw new InvalidDataException("Invalid header name: " + header);
            headerList.Add(header);
        }
        return headerList;
    }

上記は正常に機能し、当面必要なものを正確に返します。

私の問題は以下のコードにあります。ReadLine()を呼び出すと、HttpPostedFileBaseから何も取得されません。

    public List<string> ImportFileStream(HttpPostedFileBase importFile) {
        var sr = new StreamReader(importFile.InputStream);
        var headerString = sr.ReadLine();
        var headerArray = headerString.Split(',');
        var cb = new DelimitedClassBuilder("temp", ",") { IgnoreFirstLines = 0, IgnoreEmptyLines = true, Delimiter = "," };
        foreach (var header in headerArray) {
            cb.AddField(header, typeof(string));
            cb.LastField.FieldQuoted = true;
            cb.LastField.QuoteChar = '"';
        }
        var engine = new FileHelperEngine(cb.CreateRecordClass());
        var dataTable = engine.ReadStreamAsDT(sr);
        var noteData = new List<string>();
        var jsonSerializer = new JsonSerializeDataRow();
        foreach (var row in dataTable.Rows) {
            var dataRow = row as DataRow;
            var jsonRow = jsonSerializer.Serialize(dataRow);
            noteData.Add(jsonRow);
        }
        return noteData;
    }

HttpPostedFileBaseを閉じようとしました。また、ストリームの位置を0に設定しました。何も起きていないようです。セッションに保存する前に、別のタイプに変更する必要があると感じています。

何かアドバイス??

ありがとう!

4

3 に答える 3

6

HttpPostedFileBaseをセッションに保存することはできません。これは意味がありません。これには、リクエストの最後にガベージコレクションされるHTTPリクエストストリームのファイルコンテンツを指すストリームが含まれています。セッションに保存する前に、カスタムオブジェクトにシリアル化する必要があります。例えば:

public class MyFile
{
    public string Name { get; set; }
    public string ContentType { get; set; }
    public byte[] Contents { get; set; }
}

次に、これをセッションに保存します。もちろん、これを行うと、ファイルの内容全体がメモリに保存されることに注意する必要があります。これは、アップロードされたファイルが大きくなる可能性がある場合は特に、やりたくないことかもしれません。もう1つの可能性は、ファイルの内容をディスクやデータベースなどの永続メディアに保存し、後で取得できるように、このメディアへのポインターのみをセッションに保存することです。

于 2011-01-20T13:48:47.800 に答える
2

HttpPostedFileBaseを使用している場合は、最初にクローンを作成する必要があります。このgit
のコードを使用した ので、名前空間にクラスとして追加する必要があります。

public static class HttpPostedFileBaseExtensions
{
    public static Byte[] ToByteArray(this HttpPostedFileBase value)
    {
        if (value == null)
            return null;
        var array = new Byte[value.ContentLength];
        value.InputStream.Position = 0;
        value.InputStream.Read(array, 0, value.ContentLength);
        return array;
    }
}

これで、次のようにHttpPostedFileBaseを読み取ることができます。

private static void doSomeStuff(HttpPostedFileBase file)
{
    try
    {
        using (var reader = new MemoryStream(file.ToByteArray()))
        {
            // do some stuff... say read it to xml
            using (var xmlTextReader = new XmlTextReader(reader))
            {                    

            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

これを使用した後でも、メインコードを書き込むことができます。

file.SaveAs(path);

そしてそれをファイルに保存します。

于 2014-02-09T08:40:00.830 に答える
0

HttpPostedFileHTTPリクエストストリームから直接読み取ります。
再利用には適していません。

于 2011-01-20T13:47:29.740 に答える