我正在尝试将文件从管理员端上传到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
文件夹下的上传文件夹吗?
另外,如何删除文件,而不仅仅是删除时的表格行?
答案 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)
一些注意事项:
第一个选项的好处是您可以轻松地为您的操作添加身份验证等以保护对文件的访问,而第二个选项则要求您在具有相应角色的文件夹中添加web.config。访问权限。但是,另一方面,您必须在操作方法中提供适当的标头,以便浏览器知道如何处理该文件,而不是让IIS为您解决。