如何在 IISExpress 中发布应用程序后下载文件

HOW to download file, after publish App in IISExpress

美好的一天。 我想从我服务器的物理路径下载文件。当我 运行 我的应用程序通过 vs2012 时,它的工作变得更好,我看到了来自物理路径的文件列表。但是当我在服务器上发布应用程序时,该文件不在列表中。我需要确保有任何物理路径,但文件不应存储在应用程序包中

此处代码:

 public ActionResult NIRInfo()
{
    List<string> filesList = new List<string>();
    var dir = new System.IO.DirectoryInfo(@"Z:\Docs");
    System.IO.FileInfo[] fileNames = dir.GetFiles("*.*");
    var xow = from i in db.NIRs where i.Id == id select i.File;
    foreach (var i in xow)
    {
        fileNames = dir.GetFiles(i);
        foreach (var f in fileNames)
        {
            filesList.Add(f.Name);
        }
        ViewData["fList"] = filesList;
    }
    return View(nir);

}

和代码class下载

public FileResult Download(string Name)
{
    return File(@"Z:\Docs\" + Name, MediaTypeNames.Application.Octet, Name); 
}

及查看代码:

                        @{ var fList = ViewData["fList"] as List<string>;}

                        @if (ViewData["fList"] != null)
                        {
                            <table>
                                <div style="border-top: #444444 1px solid"></div>
                                <b style="font-weight: normal">Files: </b>
                                <br />
                                <div style="border-top: #444444 1px solid"></div>
                                @foreach (var f in fList)
                                {
                                    <a href="@Url.Action("Download", "NIR", new { Name = @f })">@f
                                        <br />
                                    </a> 
                                }
                            </table>
                        }

A 假定您在本地计算机上为文件指定的路径与服务器上的路径不同。这意味着例如在您的本地计算机上文件位于 "Z:\Docs",但在服务器上它可能是 "C:\Docs"。

由于您在应用程序中对位置进行了硬编码,因此您无法在发布后在应用程序中更改它,您必须在应用程序中更改它,然后使用正确的文件路径重新发布它对于服务器。

这是一个繁琐的过程,我宁愿建议您将文件的位置添加到 web.config 中,并使用 web.config 中的值作为文件的路径。这意味着您可以将网站发布到任何服务器,文件的任何路径,您可以简单地调整 web.config 中的路径,而不必每次都重新发布网站。

您可以将密钥添加到 web.config 的 <appSettings> 部分。像这样

<add key="DownloadDocumentsPath" value="C:\Docs" />

然后在您的代码中,您可以只从 web.config 中读取值,这会将您的 NIRInfo 方法更改为如下所示:

public ActionResult NIRInfo()
{
    List<string> filesList = new List<string>();

    string fileDownloadPath =   System.Configuration.ConfigurationManager.AppSettings["DownloadDocumentsPath"];

    var dir = new System.IO.DirectoryInfo(@fileDownloadPath );
    System.IO.FileInfo[] fileNames = dir.GetFiles("*.*");
    var xow = from i in db.NIRs where i.Id == id select i.File;
    foreach (var i in xow)
    {
        fileNames = dir.GetFiles(i);
        foreach (var f in fileNames)
        {
            filesList.Add(f.Name);
        }
        ViewData["fList"] = filesList;
    }
    return View(nir);
}

你的下载方法是这样的:

public FileResult Download(string Name)
{
    string fileDownloadPath =     System.Configuration.ConfigurationManager.AppSettings["DownloadDocumentsPath"];
    return File(@fileDownloadPath + Name, MediaTypeNames.Application.Octet, Name); 
}