为什么我的文件下载链接似乎有效,但无法找到该文件?

时间:2016-03-29 21:08:08

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

我将此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项目有一个名为&#34; App_Data&#34;的文件夹。其中 包含名为&#34; MinimalSpreadsheetLight.xlsx&#34;

的文件

下载链接确实在页面上呈现,并且点击它确实首先出现下载文件(它有Excel图标,并且带有文件名),但是在它之下它表示&#34;失败 - 没有文件&#34;:

enter image description here

我的HTML,我使用的路径,文件权限或什么问题?

到目前为止,我只用Chrome测试了这个,BTW。 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>");

...(添加&#34;电子表格文件&#34;并关闭锚标记),现在出现链接;但是,我仍然得到了#34;失败 - 没有文件&#34; msg,然后双击&#34;下载的文件&#34;什么都不做。

更新4

我尝试了在Update 3中看到的其他两种排列方式,即在&#34; App_Data&#34;之前重新引入了前向错误:

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

...但结果在任何这些排列中都是相同的(&#34;失败 - 没有文件&#34;)。

更新5

我也尝试过没有&#34; App_Data&#34;根本不需要关闭变更:

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

...但相同&#34;失败 - 没有文件&#34;也是这种尝试的结果。

更新6

好的,所以我也试过了(单引号):

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

......但没有变化。文件那里:

enter image description here

...为什么没有看到或无法访问?

更新7

此:

string fullPath = HttpContext.Server.MapPath("~/App_Data/MinimalSpreadsheetLight.xlsx");

...(我从here获得)无法编译,&#34; 非静态字段,方法或属性需要对象引用系统.Web.HttpContext.Server.get&#39;

2点击错误信息突出显示&#34;服务器&#34;

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

为了让这些文件可供下载,请将它们移到“内容”下的文件夹中。 (如果你有一个mvc站点)并确保你的web.config允许下载.xlsx exention。

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

Downloading Docx from IE - Setting MIME Types in IIS