Html правильный filePath для загрузки файла с сервера - PullRequest
0 голосов
/ 15 мая 2019

Я выполнил функцию сохранения файла в папку на сервере, ** Я сейчас пытаюсь получить файл с сервера с помощью HTML download, но пока не нашел способ получить правильный путь к файлу. .

После сохранения файла в папке на сервере, сохранения filePath в БД с помощью Entity Framework я извлек file из БД с помощью filePath = /VisitReportAttachments/1ea2b64e-545d-4c50-ae7d-eefa7178d310.png. Но этот filePath не работает правильно.

 <a href="@file.Path" download="@file.name">Click here to download</a>
//file.Path = /VisitReportAttachments/1ea2b64e-545d-4c50-ae7d-eefa7178d310.png

Я получил ошибку: Failed - No file

Посмотрите на создание FilePath path в коде SaveFile в контроллере:

private void SaveFile(HttpPostedFileBase file)
{
    string serverPath = "\\VisitReportAttachments";
      if (file!= null)
        {
        if (!Directory.Exists(serverPath))
        {
            Directory.CreateDirectory(serverPath);
        }
         var fileName = Guid.NewGuid()+ Path.GetExtension(file.FileName);
         var path = Path.Combine("\\", new DirectoryInfo(serverPath).Name, fileName);
         path = relativePath.Replace(@"\", "/"); //this path is stored to DB
          ....
       //As I mentioned: save file to Server is done. I simply post the code that create the filepath in SQL DB while file is storing to Server*
        }
}

FilePath хранится в БД, например: /VisitReportAttachments/1ea2b64e-545d-4c50-ae7d-eefa7178d310.png enter image description here

Нужна помощь!

Ответы [ 4 ]

1 голос
/ 15 мая 2019

Обнаружил решение с помощью Server.MapPath для сопоставления filePath с правильным путем.

Вместо использования загружаемой ссылки в представлении HTML, я создаю функцию загрузки в контроллере:

[HttpPost]
        [Authorize]
        public ActionResult DownloadAttachment()
        {
            return Json(true);
        }

        [HttpGet]
        public ActionResult Download(Guid? attachmentId)
        {
            var visitAttachment = _visitAttachmentService.FindOne(x => x.Id == attachmentId);
            try
            {
                var serverPath = Server.MapPath(visitAttachment.Path);
                byte[] fileBytes = System.IO.File.ReadAllBytes(serverPath);
                return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, visitAttachment.AttachmentName);

            }
            catch
            {
                return File(Encoding.UTF8.GetBytes(""), System.Net.Mime.MediaTypeNames.Application.Octet, visitAttachment.AttachmentName);
            }

        }

Вызовите этот метод в представлении:

<a href="" onclick="Download('@file.Id');">@file.AttachmentName</a>

<script>
    function Download(attachmentId) {
            var url = '/Visits/DownloadAttachment';
            $.post(url,
                {
                    //                  FilePath: filePath
                },
                function (data) {
                    var response = JSON.parse(data);
                    window.location = '/Visits/Download?attachmentId=' + attachmentId;
                },
                "json");
        }
    </script>

Теперь он отлично работает.

0 голосов
/ 15 мая 2019

Ваш метод private string SaveFile(HttpPostedFileBase file) должен возвращать объект модели NewFile, который отражает сущность в вашей базе данных. private NewFile SaveFile(HttpPostedFileBase file)

public class NewFile
{
   public int NewFileId { get; set; } 
   public string FileName { get; set; }
   public string FilePath { get; set; }
}

Вам нужно будет сделать что-то похожее на следующий код при сохранении файла:

using (var db = new YourDbContext())
{
   var newFile = new NewFile { FileName = fileName, FilePath = path };

   var savedFile = db.Add(newFile);

   db.SaveChanges();

   return savedFile;   // here is the object you can return to the view and access 
                       // its properties
}
0 голосов
/ 15 мая 2019
    private string SaveFile(HttpPostedFileBase file)
    {
        if (file == null)
            return string.Empty;

        string saveFolder = "VisitReportAttachments";

        string fileName = fileName = Guid.NewGuid() + Path.GetExtension(file.FileName);
        string serverFolderPath = AppDomain.CurrentDomain.BaseDirectory + "/" + saveFolder;
        string savePath = serverFolderPath + "/" + fileName;


        if (!Directory.Exists(serverFolderPath))
            Directory.CreateDirectory(serverFolderPath);

        file.SaveAs(savePath);

        return Url.Content($"~/{saveFolder}/{fileName}");
    }
0 голосов
/ 15 мая 2019

Вы не загрузили файл в папку.Добавьте строку ниже в коде

file.SaveAs(serverPath + file.FileName);

Таким образом, ваш код C # будет выглядеть как

private string SaveFile(HttpPostedFileBase file)
{
    string serverPath = "\\VisitReportAttachments";
      if (file!= null)
        {
        if (!Directory.Exists(serverPath))
        {
            Directory.CreateDirectory(serverPath);
        }
         var fileName = Guid.NewGuid()+ Path.GetExtension(file.FileName);
         var path = Path.Combine("\\", new DirectoryInfo(serverPath).Name, fileName);

         file.SaveAs(serverPath + file.FileName);

         path = relativePath.Replace(@"\", "/");

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