Загрузка и просмотр файлов ASP.NET MVC 5

у меня есть этот код:

    [HttpPost]
    public ActionResult Create(Knowledgebase KB, HttpPostedFileBase file)
    {
        var KBFilePath = "";
        if (ModelState.IsValid)
        {
            if (file.ContentLength > 0)
            {
                var fileName = Path.GetFileName(KB.KnowledgebaseTitle);
                var path = Path.Combine(Server.MapPath("~/Resources/KBArticles"), fileName + ".pdf");
                KBFilePath = path;
                file.SaveAs(path);
            }
            KB.KnowledgebaseLink = KBFilePath;
            db.Knowledgebases.Add(KB);
            db.SaveChanges();
            return RedirectToAction("Index", "Home");
        }

        else
        {
            return View();
        }

ссылка на путь к файлу, который хранится в БД, которая начинается с C:/

на другой странице Я могу просмотреть содержимое записи. Когда я нажимаю на ссылку, на которую он сохранен на C:/, Chrome говорит: "не удалось загрузить локальный ресурс". Я сохраняю в папке Resources, которая является частью моего ASP.NET каталог приложений. В любом случае вокруг этого?

изменить Страница обслуживается с этой точки зрения:

public ActionResult Suggestions(String Tag)
{
      return View();
}

редактирование 2 - Я внес изменения в свой взгляд:

@{
string tag = "<td><a href=" + "~/Content/Files/" + ">" + item.Title.Replace(" ", "") + ".pdf" + "</a>" + "</td>";
 }
 @Html.Raw(tag)

запрошенный файл в адресной строке браузера -

http://localhost:62165/Incident/~/Content/Files/

теперь я получаю ошибку HTTP 404.0 не найдена ошибка

3 ответов


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

<a href="~/Content/Files/file1.pdf">File1</a>

или используйте атрибут загрузки, если вы хотите загрузить напрямую:

<a href="~/Content/Files/file1.pdf" download>File1</a>.

большинство веб-серверов настроены на отказ в запросах содержимого за пределами папки содержимого. Это можно изменить в файле конфигурации, но проще (и безопаснее), если вы используете папку содержимого. этот основано на моем опыте, если кто-то думает, что я ошибаюсь, пожалуйста, дайте мне знать, чтобы исправить мой ответ. Я всегда рад узнать что-то новое.

EDIT 1: Как построить a тег динамически

в представлении вам нужна строковая переменная link который содержит текст ссылки, которую вы хотите показать, и другую переменную path для удержания пути (возможно, оба загружены из БД в контроллере). Затем вы можете создать тег вручную, как это:

@{
    string tag = "<a href=" + path + ">" + link + "</a>";
}

@Html.Raw(tag)

EDIT 2: Работа с пробелами в Url.

вам нужно использовать Html.Content чтобы получить правильный URL-адрес.

@{
    string link = item.Title;
    string path = Url.Content("~/Content/Files/") + link.Replace(" ", "%20") + ".pdf";
    string tag = "<a href=" + path + ">" + link + "</a>";
}

@Html.Raw(tag)

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

создайте пустой проект MVC. я использую MVC 4, но он должен работать с MVC 5.


сначала создайте представление

<div class="form-group"> @Html.LabelFor(model => model.ImageData, new { @class = "control-label col-md-2" }) 
  <div class="col-md-10"> <input name="Image" type="file" /> 
    @Html.ValidationMessageFor(model => model.ImageData) 
  </div> 
</div>

затем контроллер создает действие

public ActionResult Create(ArtWork artwork, HttpPostedFileBase image) { 
  if (ModelState.IsValid) { 
    if (image != null) { //attach the uploaded image to the object before saving to Database 
      artwork.ImageMimeType = image.ContentLength; 
      artwork.ImageData = new byte[image.ContentLength]; 
      image.InputStream.Read(artwork.ImageData, 0, image.ContentLength); //Save image to file 
      var filename = image.FileName; 
      var filePathOriginal = Server.MapPath("/Content/Uploads/Originals"); 
      var filePathThumbnail = Server.MapPath("/Content/Uploads/Thumbnails"); 
      string savedFileName = Path.Combine(filePathOriginal, filename); 
      image.SaveAs(savedFileName); //Read image back from file and create thumbnail from it 
      var imageFile = Path.Combine(Server.MapPath("~/Content/Uploads/Originals"), filename); 

      using (var srcImage = Image.FromFile(imageFile)) 
      using (var newImage = new Bitmap(100, 100)) 
      using (var graphics = Graphics.FromImage(newImage)) 
      using (var stream = new MemoryStream()) { 
        graphics.SmoothingMode = SmoothingMode.AntiAlias; 
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
        graphics.DrawImage(srcImage, new Rectangle(0, 0, 100, 100)); 
        newImage.Save(stream, ImageFormat.Png); 
        var thumbNew = File(stream.ToArray(), "image/png"); 
        artwork.ArtworkThumbnail = thumbNew.FileContents; 
      } 
    } 

    //Save model object to database 
    db.ArtWorks.Add(artwork); 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
  } 
  return View(artwork); 
}

затем получить изображение или GetThumbnail метод

public FileContentResult GetThumbnailImage(int artworkId) { 
  ArtWork art = db.ArtWorks.FirstOrDefault(p => p.ArtWorkId == artworkId); 
  if (art != null) { 
    return File(art.ArtworkThumbnail, art.ImageMimeType.ToString()); 
  } else { 
    return null; 
  } 
}

и здесь для отображения в виде

<td> <img src="@Url.Action("GetThumbnailImage", "Artwork", new { Model.ArtWorkId })" alt="Artwork Image" /> </td>