Javascript 让用户下载他无法通过URL访问的文件,但该文件存储在服务器上

Javascript 让用户下载他无法通过URL访问的文件,但该文件存储在服务器上,javascript,jquery,vb.net,Javascript,Jquery,Vb.net,说明: 我正在使用vb.net和jquery,并尝试让用户下载一个文件(文件是图像或pdf文件) 我想做的是,用户可以下载文件,但不能通过URL访问文件 我是vb.net新手,不知道我的解决方案是否走在正确的道路上(显然是因为我没有让它发挥作用),我要求提供解决方案想法、有用的提示/链接和一些善意的建议,我有点沮丧 我当前的非工作解决方案: 这些文件位于与我的web应用程序的目录相同的目录中(因此->c:/…/文件和c:/…/webapp) 我在IIS上创建了一个虚拟目录来访问该文件夹 (c:/

说明:

我正在使用vb.net和jquery,并尝试让用户下载一个文件(文件是图像或pdf文件)

我想做的是,用户可以下载文件,但不能通过URL访问文件

我是vb.net新手,不知道我的解决方案是否走在正确的道路上(显然是因为我没有让它发挥作用),我要求提供解决方案想法、有用的提示/链接和一些善意的建议,我有点沮丧

我当前的非工作解决方案:

这些文件位于与我的web应用程序的目录相同的目录中(因此->c:/…/文件和c:/…/webapp)

我在IIS上创建了一个虚拟目录来访问该文件夹 (c:/…/webapp/f->c:/…/files)

所以现在我正在尝试从我的“a.aspx”向我的“a.aspx.vb”发出一个ajax请求

Response.Clear()
Response.ContentType=“image/jpg”
AppendHeader(“内容处置”、“附件;文件名=foo.jpg”)
Response.TransmitFile(“C:/…/webapp/f/foo.jpg”)
答复:End()
如果我将此代码段放入
Page\u Load
Sub,它就会工作。在
Page\u Load
Sub中,我收到错误“Response not available in the current context”

对于AJAX请求版本,我不再使用加载页面中的vb.net代码


公共共享函数下载文件(路径为字符串)为字符串
答复:Clear()
Response.ContentType=“image/jpg”
Response.AppendHeader(“内容处置”、“附件;文件名=“&path.Split(“/”)(path.Split(“/”).Length-1))
响应.传输文件(路径)
答复:End()
返回path.Split(“/”)(path.Split(“/”).Length-1)
端函数
我真的很感谢你阅读我的问题,提前谢谢你

p.S.这是我在这里的第一篇帖子,如果我犯了错误,请不要太苛刻,请善意地告诉我我做错了什么


编辑:

我现在使用FileSaver.js,我让它工作,我可以下载文件,但前提是我不隐藏包含文件的目录。这个解决方案仍然不适用于我,因为即使我不被允许,我仍然可以访问这些文件。我仍然缺少一些东西,请再次询问更多信息和帮助,提前感谢

(仍为硬编码)

Javascript:

VB.NET代码:


导入系统
导入系统.Web
导入System.Web.Services
公共类DownloadHandler:实现IHttpHandler
Public Sub-ProcessRequest(ByVal上下文作为HttpContext)实现IHttpHandler.ProcessRequest
将路径设置为字符串
path=context.Server.MapPath(“~/upload/media/file/file.pdf”)
Dim文件作为新System.IO.FileInfo(路径)
如果文件
context.Response.Clear()
context.Response.AddHeader(“内容处置”、“附件;文件名=“&file.Name”)
context.Response.AddHeader(“Content-Length”,file.Length.ToString())
context.Response.ContentType=“应用程序/八位字节流”
context.Response.WriteFile(file.FullName)
context.Response.End()
其他的
context.Response.Write(“此文件不存在。”)
如果结束
端接头
公共只读属性IsReusable()作为布尔值实现IHttpHandler.IsReusable
得到
返回错误
结束
端属性
末级

1)您可以在IIS中将目录设置为禁止客户端访问。在IIS管理器中,导航到左侧窗格中的站点。在中间的“IIS”部分下打开“请求过滤”部分。选择顶部的“隐藏段”选项卡。在右侧的“操作”下,选择“添加隐藏段…”。不幸的是,问题中的“…”隐藏了可以向我显示您需要输入什么的部分。2) 接下来,只需使用请求中的文件名,而不是整个路径,即可从.ashx处理程序请求文件。@AndrewMorton我已经有了隐藏目录,但我在上一次编辑(09.09.2019)中的解释让我很难过。很抱歉,响应太晚。什么决定用户是否可以下载文件?@AndrewMorton只有登录的用户才可以下载。如果我不隐藏目录,我可以打开存储图像或其他文件的URL并以这种方式下载,而无需登录。您可以在
Public Sub-ProcessRequest
中检查用户是否作为第一件事登录。另外,1)您可以使用
context.Response.StatusCode=404执行正确的404操作。2) 如果使用
context.Response.TransmitFile(file.Name)
(非全名),则无需设置内容长度。3) 在文档中查找
Response.End()
——这不是您想要做的。
var d = {
    "path": "c:/.../webapp/f/foo.jpg"
};

$.ajax({
    type: "POST",
    url: "a.aspx/DownloadFile",
    data: JSON.stringify(d),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data) {
        console.log(data);
        alert("success");
    },
    failure: function (msg) {
        console.log(msg);
        alert("fail");
    },
    error: function (xhr, err) {
        console.log(err);
        alert("error");
    }
});
var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.responseType = 'blob';
xhr.onload = function () {
    console.log(xhr.response);
    saveAs(xhr.response, "file.pdf"); //this is a FileSaver.js Function
}
xhr.send();