2012-05-01 4 views
39

Ho una forma Carica e voglio passare i miei dati, come un'immagine e qualche altro campo, ma io non so come riesco a caricare I Immagine ..immagine Caricamento in ASP.NET MVC

questo è il mio codice del controller:

[HttpPost] 
     public ActionResult Create(tblPortfolio tblportfolio) 
     { 
      if (ModelState.IsValid) 
      { 
       db.tblPortfolios.AddObject(tblportfolio); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(tblportfolio); 
     } 

e questo è il mio codice vista:

@model MyApp.Models.tblPortfolio 

<h2>Create</h2> 

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>tblPortfolio</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Title) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Title) 
      @Html.ValidationMessageFor(model => model.Title) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.ImageFile) 
     </div> 
     <div class="editor-field"> 
      @Html.TextBoxFor(model => model.ImageFile, new { type = "file" }) 
      @Html.ValidationMessageFor(model => model.ImageFile) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Link) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Link) 
      @Html.ValidationMessageFor(model => model.Link) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

Ora io non so come riesco a caricare I Immagine e salvare il file sul server di .. come faccio a impostare il nome Immagine di Guid.NewGuid(); ? O come posso impostare il percorso dell'immagine?

+2

Qual è il tipo di di 'model.ImageFile'? – Shimmy

+0

@Shimmy: mi limito a salvare il nome dell'immagine nel database. è una stringa. –

+0

Alla fine ho generato un GUID per ogni nuova immagine e ho salvato il suo nome nel database. La cartella non è salvata sul server, solo il nome del file immagine. La cartella viene iniettata dinamicamente. – Shimmy

risposta

44

primo luogo, è necessario modificare l'immagine per includere le seguenti:

<input type="file" name="file" /> 

allora avrete bisogno di cambiare il vostro messaggio ActionMethod di prendere una HttpPostedFileBase, in questo modo:

[HttpPost] 
public ActionResult Create(tblPortfolio tblportfolio, HttpPostedFileBase file) 
{ 
    //you can put your existing save code here 
    if (file != null && file.ContentLength > 0) 
    { 
     //do whatever you want with the file 
    } 
} 
+1

Io uso il tuo codice e penso che funzioni correttamente ma mi mostra un errore: Accesso al percorso 'C: \ Utenti \ Amministratore \ Desktop \ ND \ MyApp \ MyApp \ Uploads 'è negato. Sai perché ? perché mi mostra questo errore sul locale? –

+1

Hmmm, È necessario scoprire dal pool di applicazioni per il sito Web qual è l'identità in cui è in esecuzione (per impostazione predefinita è l'identità del pool di applicazioni) e concedere le autorizzazioni corrette. – mattytommo

+1

I Cambia l'identità del pool di applicazioni su Localsystem .. Sono rosso da qualche parte su questo che devo cambiare a localsystem ma non funziona .. qualche suggerimento? –

3

È possibile ottenerlo da Request utilizzando la raccolta Request.Files, In caso di caricamento di file singoli, basta leggere dal primo indice utilizzando Request.Files[0]:

[HttpPost] 
public ActionResult Create(tblPortfolio tblportfolio) 
{ 
if(Request.Files.Count > 0) 
{ 
HttpPostedFileBase file = Request.Files[0]; 
if (file != null) 
{ 
    // business logic here 
} 
} 
} 

In caso di più file caricando, si deve scorrere sulla raccolta Request.Files:

[HttpPost] 
public ActionResult Create(tblPortfolio tblportfolio) 
{ 
for(int i=0; i < Request.Files.Count; i++) 
{ 
    HttpPostedFileBase file = Request.Files[i]; 
    if (file != null) 
    { 
    // Do something here 
    } 
} 
} 

Se si desidera caricare file senza aggiornamento della pagina tramite la tecnologia AJAX è possibile utilizzare this article which uses jquery plugin