【问题标题】:Return file in JsonResult or return Json data in ActionResult?在 JsonResult 中返回文件还是在 ActionResult 中返回 Json 数据?
【发布时间】:2012-03-19 13:27:39
【问题描述】:

在后端使用 MVC3 .net 控制器,我正在执行 HttpPost 以通过 HttpContext 提交文件。

当服务器读取文件时,上传结果会返回一个字符串列表。

到目前为止,我已经能够使两种方案发挥作用:

1) 将字符串列表作为单个制表符分隔的字符串作为 JsonResult 返回

string tabSeparatedMessages = "";

foreach (string message in messageLog)
{
    tabSeparatedMessages = tabSeparatedMessages + message;

    if (message != messageLog[messageLog.Count - 1])
    {
        tabSeparatedMessages = tabSeparatedMessages + '\n';
    }
}
return this.Json(new
{
    success = true,
    total = messageLog.Count,
    data = tabSeparatedMessages
}, "text/html", JsonRequestBehavior.AllowGet);

2) 将文本文件中的字符串列表作为 ActionResult 返回

string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".txt";

using (StreamWriter writer = new StreamWriter(fileName))
{
    foreach (string message in messageLog)
    {
        writer.WriteLine(message);
    }
}

return File(fileName, "text/plain", "UPLOAD_RESULTS.txt");

我的问题是我想要这些方法中的每一个中的元素,但很难将两者结合起来。我想要 JsonResult 以便我可以返回一个布尔“成功”值以在客户端上释放模态等待消息。我想要 ActionResult 以便客户端可以简单地下载文件,而不是将字符串列表解析到 GUI 组件中。

有没有办法返回一个文本文件作为 JsonResult 的一部分下载或返回带有 ActionResult 的 Json 数据?

感谢您的阅读

【问题讨论】:

    标签: c# .net json http-post jsonresult


    【解决方案1】:

    很遗憾,您一次只能返回一种结果类型。如果我是你并且我真的需要将 upload_results.txt 下载到客户端,我的 json 结果中会有一个参数,它是对服务器上文件的引用。

    所以客户端首先得到上传成功的响应,然后隐藏模式对话框,然后使用 javascript 再次请求 upload_results.txt 文件。

    【讨论】:

    • 据我了解,MVC3 控制器在每次请求后都会被解构。您或其他任何人对如何保持文件生成请求和下载请求之间的用户到文件关系有任何建议吗?我正在考虑将临时文件路径与生成它的用户一起存储在数据库中,但是单个用户仍然可能有多个与他或她相关联的文件,我不确定如何确保正在下载的文件是来自正确的请求。
    • 使用发送到客户端并用于调用文件的 GUID 密钥将文件存储在网络服务器的缓存中。如果可以将服务器上作为缓存条目的残留文件设置为在 5 分钟内消失或您认为合适的内容,则可以解决问题。
    • 正如大卫描述的那样,我会这样做。 GUID 键是您要在 json 响应中发送的键,然后请求缓存中带有该 GUID 标记的文件,或者如果您更喜欢数据库。
    • 谢谢大家。我真的很感激。
    【解决方案2】:

    我同意上述观点,发送 JSON 并将文件临时存储在网络服务器上。在 JSON 中有此文件的路径,然后执行 GET

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多