【问题标题】:Why does my file download link seem to work, but is unable to find the file?为什么我的文件下载链接似乎有效,但找不到文件?
【发布时间】:2016-07-17 15:31:34
【问题描述】:

我将此 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”的文件

下载链接确实呈现在页面上,首先单击它确实会出现以下载文件(它有 Excel 图标,并带有文件名),但在其下方显示“失败 - 否文件”:

是我的 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">

...但是链接根本没有出现。

更新 3

我被this reference误导了,显示没有添加任何文字;我将代码更改为:

builder.Append("<a href=\"App_Data/MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet file\">Spreadsheet file</a>");

...(添加“电子表格文件”并关闭锚标记),现在出现链接;但是,我仍然收到“失败 - 无文件”消息,并且 2-单击“下载的文件”没有任何作用。

更新 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>");

...但任何排列的结果都是相同的(“失败 - 无文件”)。

更新 5

我也尝试过完全没有“App_Data”,在不需要的关闭更改上:

builder.Append("<a href=\"MinimalSpreadsheetLight.xlsx\" download=\"Minimal Spreadsheet download\">Spreadsheet file</a>");

...但同样的“失败 - 无文件”也是该尝试的结果。

更新 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 次错误消息会突出显示“服务器”

更新 8

这个(我从与我在更新 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);

...什么都不做;现在点击链接甚至不会给我一个虚假/失败的下载...

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 的结果没有任何影响:单击链接没有任何作用。

如果有人解决了这个问题,它肯定会在事后得到奖励。

更新 10

也许我真正需要做的是,添加一些 jQuery 来下载文件,而不是简单的 html。但问题是,jQuery 能否比原始/简单 html 更好地访问 App_Data 文件夹?

【问题讨论】:

  • 它确实改变了它;之前,我注意到链接操作实际上是在我单击另一组文本时发生的。现在,下载链接根本没有出现。
  • 请参阅更新 3。
  • 抱歉,我以为你的名字很熟悉,而且我过去曾帮助过你一些照片应用程序。可能会误会。无论如何,如果下载链接根本没有出现,我的第一个猜测是某处有一个损坏的元素,缺少结束标签或其他东西。即使 href 不正确, 之间的任何内容都应该建立一个锚链接。快速右键单击->检查元素可能会很快发现。
  • 哦,我刚刚意识到你在做什么。除了builder.Append("&lt;a href='/App_Data/MinimalSpreadsheetLight.xlsx' download='Minimal Spreadsheet file'&gt;Spreadsheet file&lt;/a&gt;");,它必须是你的文件路径或其他东西作为罪魁祸首。
  • 别担心,那么从您的 Web 根目录到 app_data 的路径是什么?我冒昧地猜测这就是你的问题所在。如果您的文件确实可以从那里访问,那么您应该可以在浏览器中输入该确切路径,但如果您收到 404,我不会感到惊讶。

标签: html asp.net-web-api download downloading-website-files


【解决方案1】:

app_data 文件夹被 iis 和 asp.net 用作存放数据库文件的私有区域,这些文件只能由服务器上运行的代码访问。

如果您尝试通过浏览器直接访问该文件夹,您将收到权限错误。

为了使文件可供下载,请将它们移动到“内容”下的文件夹(如果您有 mvc 站点)并确保您的 web.config 允许下载 .xlsx 扩展。

这可能取决于您使用的 iis 版本。

Downloading Docx from IE - Setting MIME Types in IIS

【讨论】:

  • 谢谢,伊万!非常有用的信息;我最终使用了不同的设计,将 Excel 文件存储在 SQL Server 中,然后从那里下载 - 有关详细信息,请参阅 stackoverflow.com/questions/36345052/…
  • 是的!那个我也回答了! :) 认为你在做正确的事
猜你喜欢
  • 2020-04-03
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多