2009-03-03 16 views
5

Sono molto nuovo per ASP.net MVC, quindi si prega di essere il più descrittivo possibile nella tua risposta :)caricamento di più immagini + campi di testo in ASP.NET MVC

Permettetemi di semplificare ciò che sto cercando di fare. Immagina di avere un modulo in cui vuoi inserire alcune informazioni su una macchina. I campi potrebbero essere: Marca, Modello, Anno, Immagine1, Immagine2.

Nella parte inferiore del modulo è presente il pulsante "Salva". Il metodo Controller associato salverà Image1 e Image2 su disco, otterrà i loro nomi di file e li assocerà al modello di auto, che verrà quindi salvato nel database.

Qualche idea?

Grazie ragazzi!

Modifica

winob0t mi ha fatto la maggior parte del tragitto. L'unico problema in sospeso è il seguente: Image1 e Image2 non sono campi obbligatori, quindi ora posso salvare 0,1 o 2 immagini; ma se l'utente carica solo 1 immagine, non ho modo di sapere se proviene da imageUpload1 o imageUpload2.

Ancora una volta, qualsiasi aiuto è apprezzato!

risposta

7

nel controller è possibile accedere ai file caricati come:

if(Request.Files.Count > 0 && Request.Files[0].ContentLength > 0) { 
     HttpPostedFileBase postFile = Request.Files.Get(0); 
     string filename = GenerateUniqueFileName(postFile.FileName); 
     postFile.SaveAs(server.MapPath(FileDirectoryPath + filename)); 
    } 

protected virtual string GenerateUniqueFileName(string filename) { 

    // get the extension 
    string ext = Path.GetExtension(filename); 
    string newFileName = ""; 

    // generate filename, until it's a unique filename 
    bool unique = false; 

    do { 
     Random r = new Random(); 
     newFileName = Path.GetFileNameWithoutExtension(filename) + "_" + r.Next().ToString() + ext; 
     unique = !File.Exists(FileDirectoryPath + newFileName); 
    } while(!unique); 
    return newFileName; 
} 

I campi di testo arriverà alla vostra azione di controllo come al solito cioè Request.Form [...]. Tieni presente che dovrai anche impostare l'enctype nel modulo su "multipart/form-data". Sembra che tu capisca abbastanza su ASP.NET MVC per fare il resto. Nota anche che puoi dichiarare il tuo tag form nella vista aspx come segue, anche se puoi usare l'approccio più tradizionale se lo desideri.

<% using(Html.BeginForm<FooController>(c => c.Submit(), FormMethod.Post, new { enctype = "multipart/form-data", @id = formId, @class = "submitItem" })) { %> 

<% } %> 
+0

Mi hai trovato a metà strada! Solo un piccolo problema: Image1 e Image2 non sono garantiti per essere lì. Quindi cosa succede se l'utente fornisce solo Image2 e non Image1? C'è un modo per sapere da quale controllo di caricamento proviene? –

+0

invece di Request.Files [0] dovresti essere in grado di utilizzare Request.Files ["formInputname"] – LaserJesus

+0

if (Request.Files ["formInputname"]! = Null && Request.Files ["formInputname"]. ContentLength> 0) – LaserJesus

1

Ecco la mia soluzione, la risposta di cui sopra non ha funzionato abbastanza per la mia situazione. Non importa nulla delle specifiche del modulo e consentirà più caricamenti.

for (int i = (Request.Files.Count - 1); i >= 0; i--) 
    { 
      if (Request.Files != null && Request.Files[i].ContentLength > 0) 
      { 
       string path = this.Server.MapPath("~/Content/images/"); 
       string filename = Path.GetFileName(Request.Files[i].FileName); 
       string fullpath = Path.Combine(path, filename); 
       Request.Files[i].SaveAs(fullpath); 
      } 
    } 
Problemi correlati