繁体   English   中英

返回读取到MemoryStream中的文件以在Ajax C#中下载

[英]Returning a File read into MemoryStream for download in ajax C#

我使用OpenXML在C#应用程序中创建了一个Excel文件。 随后,我将其读取为MemoryStream类型。 现在,我想从C#函数返回此文件以下载,该函数返回一个ActionResult类型。 数据返回到ajax函数中,在该函数中,我希望为用户提供下载提示,以便他们可以根据需要保存此文件。 以下是一些示例代码和我尝试过的事情。

我使用MemoryStream的目的是不需要在服务器上存储上面创建的物理文件。 有没有一种方法可以将MemoryStream的内容返回给Ajax函数进行下载?

我不想在将文件的路径发送给ajax函数的TRIAL 3中使用它进行重定向。 但是,这可行,我从IE Web浏览器获得下载消息。 但是,除了“错误”之外,试验1或试验2均未发生任何事情。

是因为我需要在服务器上有一个物理文件才能下载它。 不知道ajax代码是否还需要其他东西才能使Trial 1或Trial 2正常工作。

任何有关如何正确执行操作的提示都将非常有帮助。 谢谢

公共ActionResult createFile()

{
...

// Reads a file into memory stream.  Common for all trials below
memoryStream = ReadDataIntoMemoryStream();

// TRIAL 1                
FileStream fs= new FileStream();
memoryStream.CopyTo(fs);

string mimeType = "application/vnd.openxmlformats-
                   officedocument.spreadsheetml.sheet";

return File(fs, mimeType);

// TRIAL 2
string mimeType = "application/vnd.openxmlformats-
                   officedocument.spreadsheetml.sheet";
byte[] fileBytes = memoryStream.ToArray();
return File(fileBytes, mimeType);

// TRIAL 3
string filepath = "..\...\..\filename.xlsx";  // actual physical file on 
                                              // the server
return Content(filepath);

}

阿贾克斯

$(document).ready(function () {
    $('#777').on('click', function () {
        $.ajax({
            method: "GET",
            url: "Report/createFile",
            contentType: "application/download",  // not needed for Trial 3 
                                                  // where string is returned
            dataType:"text",
            success: function (data) {
            // window.location.href = data;  // THIS WORKS with TRIAL 3 
                                             // where filepath is returned
             },
            error: function (data) {
                alert("Error.");
            },
        });
    });
});

做好您的工作展示。

将内容放入memoryStream ,其Position属性将指向流的末尾。 将其重新设置为开始即可阅读。

memoryStream = ReadDataIntoMemoryStream();
memoryStream.Position = 0L;

然后,您可以按需要使用File方法。

return File(memoryStream, mimeType, suggestedFileName);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM