2016-07-13 4 views
0

У меня возникают проблемы с загрузкой файлов в ASP.NET MVC с помощью Visual Studio. Основная цель моего кода - хранить файлы лицензий в локальной файловой системе. Моя функция загрузки работает нормально, однако моя функция загрузки не работает. Поскольку база данных, которую я использую, не может хранить списки, я в настоящее время храню каждое имя файла в строке как таковой: «9-0.lic, 9-1.lic, 9-2.lic». Первое число (9) является первичным ключом для моей модели SoftwareLicense, а число после тире - номер файла лицензии (1, 2 и 3).Загрузка нескольких файлов; ASP.NET MVC C#

SoftwareLicense Модель:

public class SoftwareLicense 
{ 
    [Key] 
    public int SoftwareID { get; set; } // Properties of class SoftwareLicense 

    public int UserID { get; set; } 
    [ForeignKey("UserID")] 
    public virtual IntranetUser User { get; set; } 

    [Required(ErrorMessage = "Software title field is required.")] 
    [Display(Name = "Software Title")] 
    public string SoftwareName { get; set; } 

    [Required(ErrorMessage = "The software key field is required")] 
    [Display(Name = "Software Key")] 
    public string SoftwareKey { get; set; } 

    [Required(ErrorMessage = "The software price field is required")] 
    [Display(Name = "Software Price")] 
    public decimal Price { get; set; } 

    [Display(Name = "License File")] 
    public string LicenseFileName { get; set; } 

    [Display(Name = "File Path")] 
    public string LicenseFilePath { get; set; } 

    [Required(ErrorMessage = "The start date field is required.")] 
    [Display(Name = "Start Date")] 
    public DateTime StartDate { get; set; } 

    [Required(ErrorMessage = "The end date field is required")] 
    [Display(Name = "End Date")] 
    public DateTime EndDate { get; set; } 

    [Required(ErrorMessage = "The license type field is required")] 
    [Display(Name = "License Type")] 
    public string LicenseType { get; set; } 

    [Display(Name="Department Name")] 
    public string DepartmentName { get; set; } 

    [Required(ErrorMessage = "The notify time field is required")] 
    [Display(Name = "Notify Time")] 
    public int NotifyTime { get; set; } 

    [Required(ErrorMessage = "The email field is required")] 
    [Display(Name = "Entry Created By")] 
    public string Email { get; set; } 

    public bool Active { get; set; } 
} 

PreDownload Метод в SoftwareLicense Контроллер:

public ActionResult PreDownload(int ID) 
    { 
     SoftwareLicense softwareLicense = db.SoftwareLicenses.Find(ID); 

     var fileNames = softwareLicense.LicenseFileName.Split(','); 

     foreach(string fileName in fileNames) 
     { 
      if(fileName.Length > 1) 
      { 
       Download(fileName, softwareLicense.SoftwareName); 
      } 
     } 
     SetUserInfo(); 
     return View("Details", softwareLicense); 
    } 

Метод загрузки в SoftwareLicense контроллер:

public FileResult Download(string fileName, string licenseName) 
    { 
     string returnName = licenseName + '-' + fileName; 

     if((fileName != "") || (fileName != " ")) 
     { 
      return File("C:/Users/heathera/Desktop/Licenses/" + fileName, MediaTypeNames.Application.Octet, returnName); 
     } 
     else 
     { 
      return null; 
     } 

    } 

Если у кого есть какие-либо указатели или решения, пожалуйста, дайте мне знаете, я застрял на этом в течение дня или двух сейчас и не могу показаться выясните это. Кроме того, если у вас есть какие-либо указатели на любой из моих кодов, я всегда готов узнать о более умном программировании.

Заранее благодарен! Эндрю.

+1

Что именно вы имеете в виду под "не работает"? – stuartd

+0

Обратите внимание, что тег-контроллер-модель-контроллер предназначен для вопросов о шаблоне. Существует определенный тег для реализации ASP.NET-MVC. –

+1

Если вы хотите вернуть несколько файлов, вам было бы лучше положить их в контейнер, например, zip-файл – stuartd

ответ

0

Я предполагаю, что мои проблемы были вызваны проблемой браузера. Прочитав ответ @ DavidG, я смог успешно изменить действие PreDownload контроллера SoftwareLicense для создания списка имен файлов, которые необходимо загрузить. Оттуда я создал новое представление с именем «DownloadList» и создал таблицу HTML с именами файлов, которые являются первым столбцом, а ActionLink передает имя файла в действие «Загрузка» в контроллере SoftwareLicense, являющемся вторым столбцом.

Этот подход, кажется, работает отлично, плюс мне не пришлось сильно менять действие Download (пришлось изменить несколько строк, чтобы определить имя файла и имя лицензии)!

спасибо @DavidG!

***** Обновленный код ниже *****

SoftwareLicense Модель не изменилась.

PreDownload Действие в SoftwareLicense контроллера:

public ActionResult PreDownload(int ID) 
    { 

     SoftwareLicense softwareLicense = db.SoftwareLicenses.Find(ID); 

     TempData["SoftwareID"] = softwareLicense.SoftwareID; 

     var fileNames = softwareLicense.LicenseFileName.Split(','); 

     List<string> downloadList = new List<string>(); 

     foreach(string fileName in fileNames) 
     { 
      if(fileName.Length > 1) 
      { 
       downloadList.Add(softwareLicense.SoftwareName + '_' + fileName); 
      } 
     } 
     SetUserInfo(); 
     return View("DownloadList", downloadList); 
    } 

Скачать Действие в SoftwareLicense контроллера:

public FileResult Download(string fileName) 
    { 
     string licenseName = fileName.Split('_')[1]; 

     string filePath = "C:/Users/heathera/Desktop/Licenses/" + licenseName; 

     string returnName = fileName; 

     if((fileName != "") || (fileName != " ")) 
     { 
      return File(filePath, MediaTypeNames.Application.Octet, returnName); 
     } 
     else 
     { 
      return null; 
     } 
    } 
+0

Добро пожаловать :) – DavidG

Смежные вопросы