Home > Enterprise >  FileStreamResult NOT returning file
FileStreamResult NOT returning file

Time:08-02

I have very simple example to export some data to Excel file, in some reason I see the bytes in the response but no file downloaded why?

public async Task<IActionResult> exportRecordsToExcel()
{
    var file = await ServiceRequestBL.ExportFO_SrviceRequestToExcel();
  
    return file;
}    

public async Task<FileStreamResult> ExportFO_SrviceRequestToExcel()
{
    DataTable dt = new DataTable("Grid");
    dt.Columns.AddRange(new DataColumn[13] {
        new DataColumn("1"), new DataColumn("2"), new DataColumn("g"), new DataColumn("j"), new DataColumn("k"), new DataColumn("l"), new DataColumn("x"), new DataColumn("m"), new DataColumn("9"), new DataColumn("8"), new DataColumn("7"), new DataColumn("6"), new DataColumn("5")});
    byte[] data = null;
    using (MemoryStream stream = new MemoryStream())
    {
        IFormatter bf = new BinaryFormatter();
        dt.RemotingFormat = SerializationFormat.Binary;
        bf.Serialize(stream, dt);
        data = stream.ToArray();
    }
    var memoryStream = new MemoryStream();
    memoryStream.Seek(0, SeekOrigin.Begin);

    string filename = "Report.xlsx";

    return new FileStreamResult(memoryStream, "application/ms-excel") { FileDownloadName = filename };
}

CodePudding user response:

You do not need a using block when using FileStreamResult, as this wrapper will take care of disposing the stream when it is no longer needed (it already uses using internally).

Simply serialize your data into a stream with Serialize(stream, ...) as you have, and pass that stream over to FileStreamResult. Let it take of care of the rest.

CodePudding user response:

You are passing an empty MemoryStream rather than the one you stored the data in

public Task<FileStreamResult> ExportFO_SrviceRequestToExcel()
{
    var dt = new DataTable("Grid")
    {
        RemotingFormat = SerializationFormat.Binary,
        Columns =
        {
            {"1"}, {"2"}, {"g"}, {"j"}, {"k"}, {"l"}, {"x"},
            {"m"}, {"9"}, {"8"}, {"7"}, {"6"}, {"5"}
        },
    };
    var stream = new MemoryStream();
    var bf = new BinaryFormatter();
    bf.Serialize(stream, dt);
    memoryStream.Seek(0, SeekOrigin.Begin);

    string filename = "Report.xlsx";

    return Task.FromResult(new FileStreamResult(memoryStream, "application/ms-excel") { FileDownloadName = filename });
}

The stream does not need a using because FileStreamResult will dispose it, and in any case it's a MemoryStream which is backed only by an array.

Also, in this case there is no need for async as you are not awaiting anything.

I note that BinaryFormatter is deprecated and has security issues. Consider using another serializer if possible.

  • Related