2009-03-03 7 views
5

Je suis très nouveau pour ASP.net MVC, donc s'il vous plaît être aussi descriptif que possible dans votre réponse :)images + Télécharger plusieurs champs de texte dans ASP.NET MVC

Permettez-moi de simplifier ce que je suis en train de faire. Imaginez que j'ai un formulaire où vous voulez entrer des informations sur une voiture. Les champs peuvent être: Marque, Modèle, Année, Image1, Image2.

Au bas du formulaire se trouve un bouton "Enregistrer". La méthode de contrôleur associée va enregistrer Image1 et Image2 sur le disque, obtenir leurs noms de fichiers et les associer au modèle de voiture, qui sera ensuite enregistré dans la base de données.

Des idées?

Merci les gars!

Modifier

winob0t m'a fait la plupart du chemin. Le seul problème en suspens est le suivant: Image1 et Image2 ne sont pas des champs obligatoires, donc je peux maintenant sauvegarder 0,1 ou 2 images; mais si l'utilisateur ne télécharge qu'une image, je n'ai aucun moyen de savoir s'il provient de imageUpload1 ou d'imageUpload2.

Encore une fois, toute aide est appréciée!

Répondre

7

Dans votre contrôleur, vous pouvez accéder aux fichiers téléchargés comme:

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; 
} 

Les champs de texte arrivent à votre action de contrôleur comme d'habitude à savoir Request.Form [...]. Notez que vous devrez également définir l'enctype sur le formulaire à "multipart/form-data". Il semble que vous compreniez assez ASP.NET MVC pour faire le reste. Notez également que vous pouvez déclarer votre balise de formulaire dans la vue aspx comme suit, bien que vous puissiez utiliser l'approche plus traditionnelle si vous le souhaitez.

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

<% } %> 
+0

Vous m'avez fait la moitié du chemin! Un seul petit problème: Image1 et Image2 ne sont pas garantis d'être là. Alors que faire si l'utilisateur ne fournit que Image2 et non Image1? Existe-t-il un moyen de savoir de quel contrôle de téléchargement il provient? –

+0

au lieu de Request.Files [0] vous devriez pouvoir utiliser Request.Files ["formInputname"] – LaserJesus

+0

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

1

Voici ma solution, la réponse ci-dessus n'a pas vraiment fonctionné pour ma situation. Il ne se soucie pas des spécificités du formulaire et permettra plusieurs téléchargements.

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); 
      } 
    } 
Questions connexes