asp.net-mvc-5 - 如何在 mvc5 中删除特定上传的文件?
问题描述
上传文件后,我希望能够将其删除。我尝试这样做,但我收到错误“找不到资源”。另外,如何为行中的每个文件制作编辑按钮,以便上传该特定文件的更好版本?有人可以帮助我吗?
这是我的控制器:
public class FileUploadController : Controller
{
// GET: FileUpload
public ActionResult Index()
{
var items = GetFiles();
return View(items);
}
// POST: FileUpload
[HttpPost]
public ActionResult Index(HttpPostedFileBase file)
{
if(file != null && file.ContentLength > 0 )
try
{
string path = Path.Combine(Server.MapPath("~/Files"),
Path.GetFileName(file.FileName));
file.SaveAs(path);
ViewBag.Message = "File uploaded successfully";
}
catch(Exception ex)
{
ViewBag.Message = "ERROR:" + ex.Message.ToString();
}
else
{
ViewBag.Message = "You have not specified a file.";
}
var items = GetFiles();
return View(items);
}
public FileResult Download(string downloadedfile)
{
var FileVirtualPath = "~/Files/" + downloadedfile;
return File(FileVirtualPath, "application/force-download", Path.GetFileName(FileVirtualPath));
}
private List <string> GetFiles()
{
var dir = new System.IO.DirectoryInfo(Server.MapPath("~/Files"));
System.IO.FileInfo[] fileNames = dir.GetFiles("*.*");
List<string> items = new List<string>();
foreach (var file in fileNames)
{
items.Add(file.Name);
}
return items;
}
[HttpPost]
public ActionResult Delete(string file)
{
file = Path.Combine(Server.MapPath("~/Files"), file);
FileInfo fl = new FileInfo(file);
if (fl != null)
{
System.IO.File.Delete(file);
fl.Delete();
}
return View();
}
}
}
这是视图,唯一的问题是删除部分:
<h2> File Upload </h2>
@model List<string>
@using (Html.BeginForm("Index", "FileUpload", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
<label for="file"> Upload </label>
<input type="file" name="file" id="file" />
<br /><br />
<input type="submit" value="Upload" />
<br /><br />
@ViewBag.Message
<br />
<h2>Documents list</h2>
<table style="width:100%">
<tr>
<th> File Name </th>
<th> Link </th>
</tr>
@for (var i = 0; i <= (Model.Count) - 1; i++)
{
<tr>
<td>@Model[i].ToString() </td>
<td>@Html.ActionLink("Download", "Download", new { downloadedfile = Model[i].ToString() }) </td>
<td>@Html.ActionLink("Delete", "Delete", new { deletedfile = Model[i].ToString() }) </td>
</tr>
}
</table>
}
解决方案
在您发布到删除方法的表单中,没有任何内容表明要删除的文件的路径是什么。您确实有一个 Count 属性的隐藏输入,但如果这是一个名为“file”的隐藏输入并且包含要删除的文件的路径值,那么它将被发布。
请注意,出于安全原因,您可能不希望人们只发布任何文件的路径,服务器将删除它。那会给你带来很多麻烦。您可能应该使用文件 url 和 ID 存储数据库记录并将该 ID 发布到服务器,并从数据库中读取 URL,然后删除文件。
推荐阅读
- ruby-on-rails - 如何处理可能需要相同 id 的条目
- c# - .NET Core 2.0 中的 HtmlHelper,其中注入了 appsettings
- python - 如何打印特定列表?
- php - 类 CURLFile 的对象无法转换为字符串
- smartcard - 我想使用 ES3.CreateISDP 函数在 eUICC 上创建一个安全域
- go - 初始化嵌套匿名结构
- amazon-web-services - 尽管禁用了 VPC DNS 主机名,boto3 instance.private_dns_name 仍会返回
- javascript - JS中空二维数组的长度是多少?
- node.js - Sentry: express api basic auth 中间件使sentry无法工作
- safari - 在 Safari 上播放 base64 webm 音频