0

我正在生成一个我不想让用户下载的小 Json 文件。所以我希望浏览器提示用户下载文件。

我已经尝试了许多相关问题中建议的答案,但这些对我不起作用。

该请求是通过单击操作链接发出的:

@Ajax.ActionLink("Generate JSON", "GenerateOcJson", new AjaxOptions { HttpMethod = "POST" })

我试过了:

var cd = new System.Net.Mime.ContentDisposition { FileName = fileName, Inline = false };
Response.AppendHeader("Content-Disposition", cd.ToString());

return File(Encoding.UTF8.GetBytes(jsonString),
            "application/json",
            string.Format(fileName));

和:

Response.Clear();
Response.ContentType = "application/json";
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.json");
Response.Write(jsonString);
Response.End();

但是浏览器不会下载文件。我正在使用 MVC3,此方法由 actionlink 调用。我已经尝试过 POST 和 GET 请求。

如果我使用 Chrome 检查请求,我会看到正确的 json 已写入浏览器响应。

有什么线索吗?提前谢谢

4

3 回答 3

1

尝试这样的事情(将 mime 类型设置为纯文本)和正常的@Html.ActionLink

public ActionResult GenerateOcJson()
{
var document = new { Data = jsonString, ContentType = "text/plain", FileName = String.Format("JSONResults_{0}.json", DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")) };//... get from service layer
    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = document.FileName,
        // Inline = false means always prompt the user for downloading.
        // Set it to true if you want the browser to try to show the file inline (fallback is download prompt)
        Inline = false,
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());
    return File(document.Data, document.ContentType);
}
于 2012-11-27T12:44:44.390 回答
0

只需返回带有 Application/Octet 媒体类型的文件结果。无需编写 content-disposition 标头。

return File(Encoding.UTF8.GetBytes(jsonString),
            System.Net.Mime.MediaTypeNames.Application.Octet, 
            fileName);
于 2012-11-27T12:29:47.433 回答
0

使用application/octet-stream. 然后浏览器会将数据视为要在本地下载的文件。

于 2012-11-27T12:29:47.940 回答