2015-08-24 7 views
5

Sono molto novizio in asp.net mvc. qui ho avuto un problema nel caricamento dell'immagine del controller chiunque può dare un aiuto ?? Questo esempio di controllo che ricevo da internet, cosa devo cambiare e il codice viewnya piace, qui voglio salvare l'immagine attraverso la "AvatarUrl"Vuoi salvare un'immagine in una cartella e salvare l'url nel database

Modello> EmployeeServices

public class EmployeeModel{ 

    [ScaffoldColumn(false)] 
    public int EmployeeID { get; set; } 

    [Required(ErrorMessage = "Please Enter Position ID")] 
    public int PositionID { get; set; } 

    [Required(ErrorMessage = "Please Enter NO PEK")] 
    public string NoPEK { get; set; } 

    [Required(ErrorMessage = "Please Enter NO KTP")] 
    public string NoKTP { get; set; } 

    [Required(ErrorMessage = "Please Enter TaxID")] 
    public string TaxID { get; set; } 

    [Required(ErrorMessage = "Please Enter FirstName")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Please Enter LastName")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "Please Enter OrganizationID")] 
    public int OrganizationID { get; set; } 

    [Required(ErrorMessage = "Please Enter BirthPlace")] 
    public string BirthPlace { get; set; } 

    [Required(ErrorMessage = "Please Enter BirthDay")] 
    public System.DateTime BirthDay { get; set; } 

    [Required(ErrorMessage = "Please Enter Gender")] 
    public string Gender { get; set; } 

    [Required(ErrorMessage = "Please Enter Religion")] 
    public string Religion { get; set; } 

    [Required(ErrorMessage = "Please Enter TaxAddress")] 
    public string TaxAddress { get; set; } 

    [Required(ErrorMessage = "Please Enter Home Address")] 
    public string HomeAddress { get; set; } 

    [Required(ErrorMessage = "Please Enter Current Address")] 
    public string CurrentAddress { get; set; } 

    [Required(ErrorMessage = "Please Enter Phone Number")] 
    public string PhoneNumber { get; set; } 

    [Required(ErrorMessage = "Please Enter Email")] 
    public string Email { get; set; } 

    [Required(ErrorMessage = "Please Enter IsAuditor")] 
    public string IsAuditor { get; set; } 

    [Required(ErrorMessage = "Please Enter TaxProvince ")] 
    public int TaxProvinceID { get; set; } 

    [Required(ErrorMessage = "Please Enter Tax City ")] 
    public int TaxCityID { get; set; } 

    [Required(ErrorMessage = "Please Enter Home Province ")] 
    public int HomeProvinceID { get; set; } 

    [Required(ErrorMessage = "Please Enter Home City")] 
    public int HomeCityID { get; set; } 

    [Required(ErrorMessage = "Please Enter Current Province")] 
    public int CurrentProvinceID { get; set; } 

    [Required(ErrorMessage = "Please Enter Current City")] 
    public int CurrentCityID { get; set; } 

    [Required(ErrorMessage = "Please Enter Avatar Url")] 
    public string AvatarUrl { get; set; } 
} 

controller> EmployeesController

[HttpPost] 
    public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file) 
    { 
     if (ModelState.IsValid) 
     { 
      var filename = Path.GetFileName(file.FileName); 
      var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); 
      file.SaveAs(path); 
      tyre.Url = filename; 

      _db.EventModels.AddObject(eventmodel); 
      _db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(eventmodel); 
    } 
+0

si può fare: '' eventmodel.AvatarUrl = "~/Uploads/Foto /" + nomefile; '' prima della riga '' _db.EventModels.AddObject (eventmodel); '' –

risposta

9

Caricamento di un file, la memorizzazione nel file-system locale, e il salvataggio in un database up è un modello comune. Questi sono i miei consigli.

1. Non utilizzare il nome file caricato come nome file.

Questo è comune:

var filename = Path.GetFileName(file.FileName); 
var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); 
file.SaveAs(path); 

Non pratico. Ci sono alcuni motivi:

a) I nomi dei file possono entrare in conflitto. b) I nomi di file remoti potrebbero essere incompatibili con il tuo file system locale. c) Qualcuno potrebbe provare un nome file dannoso e ciò potrebbe danneggiare il server.

Invece, generare il proprio nome file (magari utilizzando un GUID, GUID.NewGuid().ToString()) e memorizzare il nome file originale nel database.

2. Non memorizzare tutti i file in una singola cartella

Ad un certo punto, la cartella conterrà troppi file per il sistema operativo per elaborare rapidamente.

Partizione dei file per qualcosa di utile, come l'ID utente. Questo aiuta anche a separare i file tra gli utenti.

3. Non memorizzare il percorso completo del file nel database

Ad un certo punto, è possibile spostare i file (magari in una diversa unità) e tutte le posizioni di file memorizzati verrà rotto .

4. Non conservare l'URL dell'immagine nel database

Idem come # 3. Se la tua app Web cambia e vuoi cambiare gli URL delle immagini, allora hai URL errati memorizzati nel database. Dovrai eseguire la scansione e aggiornare tutti i record del tuo database.

5. Non memorizzare le informazioni percorso ridondante nel database

Mentre può essere tentati di includere "Upload/Foto /" nell'URL memorizzate nel database, ha molti problemi troppo:

a) Sono dati ridondanti. Per ogni file, stai utilizzando spazio dati extra, non necessario. b) Se l'app cambia e l'URL dovrebbe cambiare, gli URL memorizzati ora sono interrotti.

Invece, anteporre "Uploads/Photo /" all'URL dopo aver letto il valore dal database.

Aggiornamento:

Ecco alcuni esempi di codice:

[HttpPost] 
    public ActionResult Create(EventModel eventmodel, HttpPostedFileBase file) 
    { 
     if (ModelState.IsValid) 
     { 
      var originalFilename = Path.GetFileName(file.FileName); 
      string fileId = Guid.NewGuid().ToString().Replace("-", ""); 
      string userId = GetUserId(); // Function to get user id based on your schema 

      var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), userId, fileId); 
      file.SaveAs(path); 

      eventModel.ImageId = fileId; 
      eventmodel.OriginalFilename = originalFilename; 

      _db.EventModels.AddObject(eventmodel); 
      _db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(eventmodel); 
    } 

Tuttavia, vorrei essere cauti sull'utilizzo del modello di dati come il modello di azione MVC.

1

Si dovrebbe cambiare il tuo AvatarUrl a:

public HttpPostedFileBase AvatarUrl { get; set; } 

Nella tua vista, puoi creare un modulo simile al seguente. Aggiungi i campi in cui accetti l'input e utilizza un input di file per il tuo avatar. Quando il modulo viene inviato nuovamente al controller, MVC tenterà di associare gli input ai parametri.

@using(Html.BeginForm("Create", FormMethod.Post, new { enctype = "multipart/form-data" }) { 
    <fieldset> 
     @Html.LabelFor(m => m.FirstName) 
     @Html.EditorFor(m => m.FirstName) 
    </fieldset> 
    <!--  
    REST OF YOUR INPUT FIELDS HERE 
    --> 
    <fieldset> 
     @Html.LabelFor(m => m.Avatar) 
     @Html.EditorFor(m => m.Avatar) 
    </fieldset> 
    <input type="submit" value="Submit" /> 
}) 

Il tuo metodo di controllo dovrebbe essere aggiornato a:

[HttpPost] 
public ActionResult Create(EmployeeModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Create avatar on server 
     var filename = Path.GetFileName(model.AvatarUrl.FileName); 
     var path = Path.Combine(Server.MapPath("~/Uploads/Photo/"), filename); 
     file.SaveAs(path); 
     // Add avatar reference to model and save 
     model.AvatarUrl = string.Concat("Uploads/Photo/", filename); 
     _db.EventModels.AddObject(model); 
     _db.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 
    return View(model); 
} 

Se siete ancora bloccati fatemelo sapere e posso andare più in dettaglio.

C'è anche un ottimo/dettagliato scrittura relative a ciò che si sta cercando di fare qui http://cpratt.co/file-uploads-in-asp-net-mvc-with-view-models/