Изменение имени файла для скачивания в MVC3 - PullRequest
3 голосов
/ 27 ноября 2011

Проблема: У меня есть файл с именем по их идентификатору из базы данных. И когда кто-то хочет загрузить его, мне нужно изменить его на настоящее имя. Файл на сервере выглядит, например, следующим образом: http://localhost:34256/Content/uploads/23. Так, например, мое имя файла 23 , но мне нужно изменить его на textfile1.txt .

Я создал частичное представление со списком этих файлов:

@foreach (var item in Model)
{   
    <a href="/Content/uploads/@item.Id" title="@Html.Encode(item.FileName)">
        <img src="@item.IcoSrc" /><br />
        @item.FileName
    </a>    
}

Где @item.FileName - настоящее имя файла. Когда кто-то загружает файл из этого списка, он получает файл с именем @item.Id, а не @item.FileName. Как я могу это изменить?

Я использую MVC3 и .NET framevork 4.

Любая помощь высоко ценится!

Ответы [ 4 ]

8 голосов
/ 27 ноября 2011

Вы можете создать действие контроллера, которое будет обслуживать файл:

public ActionResult Download(string id, string name)
{
    var file = Server.MapPath("~/Content/uploads/" + id);
    return File(file, "application/octet-stream", name);
}

, а затем указать ссылку на это действие контроллера:

@foreach (var item in Model)
{   
    <a href="@Url.Action("Download", new { id = item.Id, name = item.FileName })" title="@Html.Encode(item.FileName)">
        <img src="@item.IcoSrc" /><br />
        @item.FileName
    </a>    
}
4 голосов
/ 27 ноября 2011

Поскольку вы используете MVC, вы можете создать действие, которое возвращает FileContentResult.

Прочитайте эту статью для деталей: http://www.mikesdotnetting.com/Article/125/ASP.NET-MVC-Uploading-and-Downloading-Files

Следующий фрагмент взят из этой статьи. Обратите внимание, что вы можете управлять свойством filename:

public FileContentResult GetFile(int id)
{
  SqlDataReader rdr; byte[] fileContent = null; 
  string mimeType = "";string fileName = "";
  const string connect = @"Server=.\SQLExpress;Database=FileTest;Trusted_Connection=True;";

  using (var conn = new SqlConnection(connect))
  {
    var qry = "SELECT FileContent, MimeType, FileName FROM FileStore WHERE ID = @ID";
    var cmd = new SqlCommand(qry, conn);
    cmd.Parameters.AddWithValue("@ID", id);
    conn.Open();
    rdr = cmd.ExecuteReader();
    if (rdr.HasRows)
    {
      rdr.Read();
      fileContent = (byte[])rdr["FileContent"];
      mimeType = rdr["MimeType"].ToString();
      fileName = rdr["FileName"].ToString();
    }
  }
  return File(fileContent, mimeType, fileName);
}
1 голос
/ 27 ноября 2011

Вы не можете сделать это в ссылке на файл. Вы должны сделать это, установив заголовок Content-Disposition в ответе, возвращая файл клиенту.

См. Этот пост для получения дополнительной информации: https://stackoverflow.com/q/3102276/280222

0 голосов
/ 27 ноября 2011

Как сказал Андерс, вам нужно использовать Content-Disposition.

Для этого создайте производную от контроллера, которая имеет метод .e.g Download, который принимает идентификатор файла. Затем вы можете прочитать идентификатор (и получить исходное имя файла) и использовать класс FileResult для доставки файла (вы можете установить имя файла, используя свойство FileDownloadName, которое установит расположение для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...