Domanda

Sono molto nuovo su ASP.net MVC, quindi per favore sii il più descrittivo possibile nella tua risposta :)

Lasciami semplificare ciò che sto cercando di fare. Immagina di avere un modulo in cui desideri inserire alcune informazioni su un'auto. I campi potrebbero essere: Marca, Modello, Anno, Immagine1, Immagine2.

Nella parte inferiore del modulo è presente un " Salva " pulsante. Il metodo Controller associato salverà Image1 e Image2 sul 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 procurato la maggior parte del modo lì. 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 foto non ho modo di sapere se proviene da imageUpload1 o imageUpload2.

Ancora una volta, ogni aiuto è apprezzato!

È stato utile?

Soluzione

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 arriveranno all'azione del controller come al solito, ad esempio Request.Form [...]. Tieni presente che dovrai anche impostare il tipo nel modulo su "multipart / form-data". Sembra che tu abbia capito abbastanza su ASP.NET MVC per fare il resto. Si noti inoltre che è possibile dichiarare il tag del modulo nella vista aspx come segue, sebbene sia possibile utilizzare l'approccio più tradizionale, se lo si desidera.

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

<% } %>

Altri suggerimenti

Ecco la mia soluzione, la risposta sopra non ha funzionato bene per la mia situazione. Non importa nulla delle specifiche del modulo e consentirà caricamenti multipli.

    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);
           }
     }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top