Загрузка и просмотр файлов 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>