【问题标题】:How to view a file located on server on click of a button?如何通过单击按钮查看位于服务器上的文件?
【发布时间】:2018-08-09 06:39:09
【问题描述】:

我通过单击按钮(按钮位于 192.xxx.x.xxx\Profile\Details 页面中)将 ID 传递给它正在调用 API 的 angularJS 控制器文件

$scope.docView = function () {     
    Method.getbyId("api call",docId).then(function(response) {
            if (response.data.message != null)
                window.open('//'+response.data.message);
            else
                alert("File Not Found !");
        }).catch(function (data) {
            console.log("Unknown Error");
        });
    }
}

API 是:

    [Route("api call")]
    [HttpGet]
    public IHttpActionResult ViewDocument (Guid? docId)
    {
          /*background work*/            

                response.Message = filePath;
            }                
        }
        catch (Exception ex)
        {
            Utils.Write(ex);
        }

        return Ok(response);
    }

在response.data.message中,服务器上的文件(192.xxx.x.xxx\folder\filename)的路径来了,它将通过window.open()打开文件。但是在 URL 中,文件夹的整个路径是可见的,这将成为安全漏洞。因此,我想在同一控制器中“在新视图中显示文件”,这将在新选项卡中打开文件。 url 应该类似于 (192.xxx.x.xxx\Profile\Details?docid=xxxxxxxxxxxxxxxxxx )。

【问题讨论】:

  • c#标签有什么意义??
  • 如果您不想直接访问该文件,请不要将其放在有 URL 的位置。即使你不直接把它送出去,它也可以被任何扫描网站的人索引,所以它已经没有安全性了。所以将它移动到离线位置,为每个文件创建一个带有ID的数据库条目,并在您的视图中使用文件ID作为参数,并在后台代码中查找数据库中的ID,找到相关文件磁盘,提取其内容并将其作为附件发送以供下载(您可以谷歌搜索示例)。
  • @ADyson 抱歉,我无法正确了解您保存 id 的含义,提取内容。
  • @ADyson 问题是我不应该下载文件,它应该只是在浏览器的新选项卡中弹出,但文件路径不作为 URL。
  • "问题是我不应该下载文件,它应该只是在浏览器的新标签中弹出"...是的,您可以打开一个新标签,但文件是否嵌入浏览器窗口或下载取决于用户的浏览器是否具有直接显示的能力。例如也许 HTML 或 JPG 或者有时 PDF 可能会显示在浏览器窗口中(由于本机支持或 Adob​​e 等插件),其他文件类型无论如何都会被下载。那部分不是你完全可以控制的

标签: angularjs asp.net-mvc asp.net-web-api


【解决方案1】:

您真正要查找的内容,可以通过 Google 快速搜索找到: "从 ASP.NET Web API 方法下载文件"。

例如 herehere 你会找到实现你正在寻找的例子。

编辑:

HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue(System.Net.Mime.DispositionTypeNames.Inline)
{
    FileName = "foo.pdf"
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

源自thisthis 线程。

您需要根据实际文件类型更改 Content-Type。此外,文件是否在浏览器中实际可见取决于浏览器是否能够这样做。

【讨论】:

  • 问题是我不应该下载文件,它应该只是在浏览器的新选项卡中弹出,而不是文件路径作为 URL。顺便说一句,谢谢你的建议。
  • 从示例 1 中您将能够派生控制器和方法。然后您需要设置正确的标题,以便您的浏览器尝试打开文件而不是下载:link
  • 我仍然不知道该写什么来代替 window.open('//'+response.data.message);在 angularJS 控制器文件中
  • windown.open('url', '_blank'); 'url' 需要是您的控制器方法的路径,您希望通过该方法使用某种形式的标识符处理文档下载,该标识符将发送哪个文档。 (例如 'url' + 'id=' + id)
  • 不,你快到了。网址是根据您为 api 指定的路由(默认为“api/{controller}/{id}”)所以您需要引用控制器名称,并在 get 方法中实现上述代码根据您的需要进行调整。在 Web Api 2 中,您还可以执行特定于操作的路由。如果你不确定你可以阅读here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2017-03-14
  • 2021-01-04
  • 2019-08-31
  • 1970-01-01
  • 2012-02-05
相关资源
最近更新 更多