为什么我的文件下载 link 似乎有效,但找不到文件?
Why does my file download link seem to work, but is unable to find the file?
我将此 HTML 添加到我通过 REST 调用呈现的页面:
StringBuilder builder = new StringBuilder();
. . .
builder.Append("<p></p>");
builder.Append("<a href=\"/App_Data/MinimalSpreadsheetLight.xlsx\" download>");
builder.Append("<p></p>");
. . .
return builder.ToString();
我的 ASP.NET Web API 项目有一个名为 "App_Data" 的文件夹,其中 包含一个名为 "MinimalSpreadsheetLight.xlsx"
下载 link 确实呈现在页面上,点击它确实出现,首先,下载文件(它有 Excel 图标,并带有文件名) ,但下面写着 "Failed - No file":
是我的HTML有问题,还是我使用的路径有问题,或者文件权限有问题,还是什么?
到目前为止,我只用 Chrome 测试过这个,顺便说一句。 IOW,这不是 IE 问题。
更新
我也用前导波浪线试过:
builder.Append("<a href=\"~/App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Spreadsheet file\">");
...然而,唉,无济于事。
更新 2
我将 HTML 的相关行更改为:
builder.Append("<a href=\"App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">");
...它在源代码中显示如下(有一些上下文):
<p>(Invoice Count excludes credits and re-delivery invoices)</p><p></p><p></p><a href="App_Data/MinimalSpreadsheetLight.xlsx" download="Minimal Spreadsheet file">
...但是 link 根本没有出现。
更新 3
我被this reference误导了,它显示没有添加任何文字;我将代码更改为:
builder.Append("<a href=\"App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">Spreadsheet file</a>");
...(添加 "Spreadsheet file" 并关闭锚标记),现在 link 出现;但是,我仍然收到 "Failed - No file" 消息,并且两次单击 "downloaded file" 什么也没做。
更新 4
我尝试了更新 3 中看到的其他两种排列方式,即在 "App_Data" 之前重新引入的前向重击:
builder.Append("<a href=\"/App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">Spreadsheet file</a>");
...加上波浪形的前置和前向重击:
builder.Append("<a href=\"~/App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">Spreadsheet file</a>");
...但结果在任何这些排列中都是相同的 ("Failed - no file")。
更新 5
我也尝试过完全不使用 "App_Data",关闭不需要的更改:
builder.Append("<a href=\"MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet download\">Spreadsheet file</a>");
...但相同的 "Failed - No file" 也是该尝试的结果。
更新 6
好的,所以我也尝试了这个(单引号):
builder.Append("<a href='/App_Data/MinimalSpreadsheetLight.xlsx' download='Minimal Spreadsheet file'>Spreadsheet file</a>");
...但没有变化。文件在那里:
...为什么看不到或无法访问?
更新 7
这个:
string fullPath = HttpContext.Server.MapPath("~/App_Data/MinimalSpreadsheetLight.xlsx");
...(我从 here 获得)编译失败,“非静态字段、方法或 属性 需要对象引用'System.Web.HttpContext.Server.get'
2-单击错误消息仅突出显示 "Server"
更新 8
这个(我从与我在 Update 7 中尝试的相同的地方得到的):
string justDataDir = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
string url2 = string.Format("<a href='{0}/MinimalSpreadsheetLight.xlsx' download='Minimal Spreadsheet file'><button type=\"button\">Spreadsheet file</button></a>", justDataDir);
builder.Append(url2);
...什么都不做;单击 link 甚至没有给我 fake/failed 下载...
justDataDir 是:
C:\Projects\ProActWebReports\ProActWebReports\App_Data
url2 是:
<a href='C:\Projects\ProActWebReports\ProActWebReports\App_Data/MinimalSpreadsheetLight.xlsx' download='Minimal Spreadsheet file'><button type="button">Spreadsheet file</button></a>
更新 9
我注意到在进一步的细齿梳理中,url2 有一个向前的重击;我对其进行了更改,以便所有问题都恢复了,但这对 Update 8 的结果没有影响:单击 link 没有任何作用。
如果有人解决这个问题,事后肯定会得到赏金。
更新 10
也许我真正需要做的是,而不是简单的 html,添加一些 jQuery 来下载文件。但问题是,jQuery 是否可以比 raw/simple html 更好地访问 App_Data 文件夹?
app_data文件夹被iis和asp.net用作私有区域,用于放置服务器上只能通过代码运行访问的数据库文件。
如果您尝试通过浏览器直接访问该文件夹,您将遇到权限错误。
为了使文件可供下载,将它们移动到 'Content' 下的文件夹(如果您有 mvc 站点)并确保您的 web.config 允许 .xlsx 扩展下载。
这可能取决于您使用的 iis 版本。
Downloading Docx from IE - Setting MIME Types in IIS
我将此 HTML 添加到我通过 REST 调用呈现的页面:
StringBuilder builder = new StringBuilder();
. . .
builder.Append("<p></p>");
builder.Append("<a href=\"/App_Data/MinimalSpreadsheetLight.xlsx\" download>");
builder.Append("<p></p>");
. . .
return builder.ToString();
我的 ASP.NET Web API 项目有一个名为 "App_Data" 的文件夹,其中 包含一个名为 "MinimalSpreadsheetLight.xlsx"
下载 link 确实呈现在页面上,点击它确实出现,首先,下载文件(它有 Excel 图标,并带有文件名) ,但下面写着 "Failed - No file":
是我的HTML有问题,还是我使用的路径有问题,或者文件权限有问题,还是什么?
到目前为止,我只用 Chrome 测试过这个,顺便说一句。 IOW,这不是 IE 问题。
更新
我也用前导波浪线试过:
builder.Append("<a href=\"~/App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Spreadsheet file\">");
...然而,唉,无济于事。
更新 2
我将 HTML 的相关行更改为:
builder.Append("<a href=\"App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">");
...它在源代码中显示如下(有一些上下文):
<p>(Invoice Count excludes credits and re-delivery invoices)</p><p></p><p></p><a href="App_Data/MinimalSpreadsheetLight.xlsx" download="Minimal Spreadsheet file">
...但是 link 根本没有出现。
更新 3
我被this reference误导了,它显示没有添加任何文字;我将代码更改为:
builder.Append("<a href=\"App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">Spreadsheet file</a>");
...(添加 "Spreadsheet file" 并关闭锚标记),现在 link 出现;但是,我仍然收到 "Failed - No file" 消息,并且两次单击 "downloaded file" 什么也没做。
更新 4
我尝试了更新 3 中看到的其他两种排列方式,即在 "App_Data" 之前重新引入的前向重击:
builder.Append("<a href=\"/App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">Spreadsheet file</a>");
...加上波浪形的前置和前向重击:
builder.Append("<a href=\"~/App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">Spreadsheet file</a>");
...但结果在任何这些排列中都是相同的 ("Failed - no file")。
更新 5
我也尝试过完全不使用 "App_Data",关闭不需要的更改:
builder.Append("<a href=\"MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet download\">Spreadsheet file</a>");
...但相同的 "Failed - No file" 也是该尝试的结果。
更新 6
好的,所以我也尝试了这个(单引号):
builder.Append("<a href='/App_Data/MinimalSpreadsheetLight.xlsx' download='Minimal Spreadsheet file'>Spreadsheet file</a>");
...但没有变化。文件在那里:
...为什么看不到或无法访问?
更新 7
这个:
string fullPath = HttpContext.Server.MapPath("~/App_Data/MinimalSpreadsheetLight.xlsx");
...(我从 here 获得)编译失败,“非静态字段、方法或 属性 需要对象引用'System.Web.HttpContext.Server.get'
2-单击错误消息仅突出显示 "Server"
更新 8
这个(我从与我在 Update 7 中尝试的相同的地方得到的):
string justDataDir = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
string url2 = string.Format("<a href='{0}/MinimalSpreadsheetLight.xlsx' download='Minimal Spreadsheet file'><button type=\"button\">Spreadsheet file</button></a>", justDataDir);
builder.Append(url2);
...什么都不做;单击 link 甚至没有给我 fake/failed 下载...
justDataDir 是:
C:\Projects\ProActWebReports\ProActWebReports\App_Data
url2 是:
<a href='C:\Projects\ProActWebReports\ProActWebReports\App_Data/MinimalSpreadsheetLight.xlsx' download='Minimal Spreadsheet file'><button type="button">Spreadsheet file</button></a>
更新 9
我注意到在进一步的细齿梳理中,url2 有一个向前的重击;我对其进行了更改,以便所有问题都恢复了,但这对 Update 8 的结果没有影响:单击 link 没有任何作用。
如果有人解决这个问题,事后肯定会得到赏金。
更新 10
也许我真正需要做的是,而不是简单的 html,添加一些 jQuery 来下载文件。但问题是,jQuery 是否可以比 raw/simple html 更好地访问 App_Data 文件夹?
app_data文件夹被iis和asp.net用作私有区域,用于放置服务器上只能通过代码运行访问的数据库文件。
如果您尝试通过浏览器直接访问该文件夹,您将遇到权限错误。
为了使文件可供下载,将它们移动到 'Content' 下的文件夹(如果您有 mvc 站点)并确保您的 web.config 允许 .xlsx 扩展下载。
这可能取决于您使用的 iis 版本。
Downloading Docx from IE - Setting MIME Types in IIS