5

我正在尝试csv使用打开/保存选项将文件导出到用户。

我的问题有点类似于how-to-force-chrome-to-open-an-open-file-dialog-when-downloading-a-file-via-as(It is downloading the file in Chrome and Firefox),我已经尝试过建议的解决方案,@Dev但它是不工作。

我写了我的代码如下: -

return File(new System.Text.UTF8Encoding().GetBytes(csvData),
                    "text/csv", filename);

但是,它在 Chrome 中不起作用。默认情况下会下载该文件。

然后在谷歌搜索之后,我发现返回-a-file-to-view-download-in-mvc,我试图从中执行如下操作:-

var csvData = "hello";// I am filling this variable with ,y values from DB!
    var cd = new System.Net.Mime.ContentDisposition
    {
        // for example foo.bak
        FileName = "test",
        Inline = false,
    };
    Response.AppendHeader("Content-Disposition", 
        cd.ToString());
    return File(new System.Text.UTF8Encoding().GetBytes(csvData),
        "text/csv");

但它仍然在 Chrome 中下载文件。然后我遇到了how-to-display-open-save-dialog-asp-net-mvc-4,其中@JoãoSimões提到:-

那是依赖于浏览器的。如果您设置自动下载到给定文件夹,浏览器将自动下载。Firefox 和 Chrome 是一些具有这种行为的浏览器。– 若昂西蒙斯 1 月 3 日 13:09

如果上述情况属实,那么我该如何克服我的问题?如何获得打开/保存对话框?我无法使用打开/保存选项导出我的 CSV。

编辑 1

我试图做这样的事情(在这里得到):-

public class ExcelResult : ActionResult
    {
        public string FileName { get; set; }
        public string Path { get; set; }
        public string Data { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            context.HttpContext.Response.Buffer = true;
            context.HttpContext.Response.Clear();
            context.HttpContext.Response.AddHeader("content-disposition", "attachment;     filename=" + FileName);
            context.HttpContext.Response.ContentType = "text/csv";
            context.HttpContext.Response.Write(new System.Text.UTF8Encoding().GetBytes(Data));
        }
    }

和我的控制器代码:-

return new ExcelResult
                {
                    FileName = "sample.xls",
                    Path = "",
                    Data = csvData
                };

但是,它仍在下载 Excel ...

编辑 2

尝试打开excelHttpContext.Current.Response

/// <summary>
/// Export CSV 
/// </summary>
/// <returns></returns>
public void DownloadCSV()
{
    try
    {
        var csvData = Session["CSVData"].ToString();


        byte[] getContent = new System.Text.UTF8Encoding().GetBytes(csvData);
        System.Web.HttpContext.Current.Response.ClearContent();
        System.Web.HttpContext.Current.Response.ClearHeaders();
        System.Web.HttpContext.Current.Response.Buffer = true;
        System.Web.HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
        System.Web.HttpContext.Current.Response.AddHeader("Content-Length", getContent.Length.ToString());
        System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + "testing.csv");
        System.Web.HttpContext.Current.Response.BinaryWrite(getContent);
        System.Web.HttpContext.Current.Response.Flush();

    }
    catch (Exception ex)
    {
        HttpResponseMessage message = new HttpResponseMessage()
        {
            Content = new StringContent("Error Exporting Data")
        };

        throw new System.Web.Http.HttpResponseException(message);

    }

}

但是,还是不行!!!

4

3 回答 3

2

@shubh 您是否尝试过如何在通过 ASP.NET 代码隐藏下载文件时强制 Chrome 打开“打开文件对话框”?第二种解决方案,他们将图像放在显示如何在 chrome 中打开对话框的位置。我有 chrome 版本 30.0.1599.101 m,如果您在该高级设置中进行设置,那么您会找到上面链接答案中给出的复选框,我认为这将解决您的问题。如果仍然无法正常工作,则可能是您的浏览器有问题,只需将其更新到最新版本,然后重试。 编辑 1: 如果您输入文件扩展名 .xls 那么它将在 excel 中打开 csv 您需要输入文件名,因为FileName = "sample.csv",它将以 csv 格式打开。

Response.Clear();
Response.Buffer = true;
Response.AddHeader("content-disposition", "attachment;filename=GridViewtoCSVExport.csv");
Response.Charset = string.Empty;
Response.ContentType = "application/text";

有关更多信息,请查看此http://surajdeshpande.wordpress.com/2013/09/03/export-gridview-data-to-csv-file-in-asp-net/

于 2013-10-30T06:37:42.177 回答
1

如果用户已将其浏览器配置为自动下载文件,那么您绝对无法在服务器上执行任何操作来强制显示此对话框。恐怕你想要达到的目标是不可能的。

于 2013-10-30T07:13:32.190 回答
0

尝试为您的 content-disposition 标头提供另一个值:

Response.AppendHeader("Content-Disposition", "attachment");
于 2013-10-21T11:05:18.320 回答