在ASP.NET MVC3中从服务器删除上载的文件

时间:2011-08-04 02:13:47

标签: asp.net-mvc asp.net-mvc-3 file-upload

我正在尝试将文件从管理员端上传到CMS中的文件夹。 前端将显示下载文件的链接。 在管理员端,我不仅要删除引用,还要从服务器中删除实际文件。

以下是我的控制器保存上传文件的部分:

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0)
    {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
        file.SaveAs(path);

        ViewBag.fileName = fileName.ToString();

        return RedirectToAction("Create", new {fileName = fileName });
    }

    return RedirectToAction("Index");
}

Create视图中,然后允许管理员输入有关文档的其他详细信息,并将其与fileName一起存储在表中。

现在我需要能够链接到该文档名称,如document.pdf。我甚至可以链接到App_Data文件夹下的上传文件夹吗?

另外,如何删除文件,而不仅仅是删除时的表格行?

2 个答案:

答案 0 :(得分:1)

创建一个单独的控制器来处理文件的下载。它还可以防止用户直接与文件进行热链接。

public ActionResult GetDocument(String pathName)
{
    try
    {
        Byte[] buffer = DownloadMyFileFromSomeWhere(pathName);
        FileContentResult result = new FileContentResult(buffer, "PDF"); // or whatever file ext
        // these next two lines are optional
        String[] folders = pathName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);            
        result.FileDownloadName = folders[folders.Length - 1];

        return result;
    }
    catch (Exception ex)
    {
        // log the error or something
    }
    return new HttpNotFoundResult();
}

DownloadMyFileFromSomeWhere(string)应该能够从某个存储(如blob甚至是本地服务器)检索字节数组文件。它看起来像:

private Byte[] DownloadMyFileFromSomeWhere(string pathname)
{
    Byte[] file = System.IO.File.ReadAllBytes(Server.MapPath(pathname));
    return file;
}

对于管理员方面,您可以采用相同的方法:编写一个单独的控制器来删除文件及其在数据库中的条目。

答案 1 :(得分:0)

一些注意事项:

  • 如果您有权在某处保存文件,您还应该有权删除它。您可以使用普通文件操作来执行此操作。
  • IIS 应该阻止您链接到App_Data下的文件。你有几个选择:
    • 创建一个从该位置读取文件并将其流回浏览器的操作
    • 存储在其他位置 - 用户实际可以访问的位置。

第一个选项的好处是您可以轻松地为您的操作添加身份验证等以保护对文件的访问,而第二个选项则要求您在具有相应角色的文件夹中添加web.config。访问权限。但是,另一方面,您必须在操作方法中提供适当的标头,以便浏览器知道如何处理该文件,而不是让IIS为您解决。