web-dev-qa-db-fra.com

Voulez-vous enregistrer une image dans un dossier et enregistrer l'URL dans la base de données

Je très novice dans asp.net mvc. ici, j'ai eu un problème dans le téléchargement d'image du contrôleur, tout le monde peut donner de l'aide? Cet exemple de contrôleur que je reçois sur Internet, que dois-je changer et comment coder viewnya, ici je veux enregistrer l'image via "AvatarUrl"

Modèle> 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; }
}

Contrôleur> EmployésContrôleur

    [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);
    }
6
Burhanumubim

Le téléchargement d'un fichier, son stockage dans le système de fichiers local et son enregistrement dans une base de données constituent un modèle courant. Ce sont mes recommandations.

1. N'utilisez pas le nom de fichier téléchargé en tant que votre nom de fichier.

Ceci est commun:

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

Ne le fais pas. Il y a quelques raisons:

a) Les noms de fichiers peuvent entrer en conflit. b) Les noms de fichiers distants peuvent être incompatibles avec votre système de fichiers local. c) Quelqu'un peut essayer un nom de fichier illicite, ce qui peut endommager votre serveur.

Au lieu de cela, générez votre propre nom de fichier (peut-être en utilisant un GUID, GUID.NewGuid().ToString()) et stockez le nom de fichier d'origine dans votre base de données.

2. Ne stockez pas tous les fichiers dans un seul dossier

À un moment donné, votre dossier contiendra trop de fichiers pour que le système d'exploitation puisse les traiter rapidement.

Partitionnez les fichiers en utilisant quelque chose d’utile, comme l’ID utilisateur. Cela permet également de séparer les fichiers entre les utilisateurs.

3. Ne stockez pas le chemin complet du fichier dans la base de données

À un moment donné, vous pouvez déplacer les fichiers (peut-être sur un autre lecteur) et tous vos emplacements de fichiers stockés seront cassés.

4. Ne stockez pas l'URL de l'image dans la base de données

Identique au n ° 3. Si votre application Web change et que vous souhaitez modifier les URL de l'image, des URL incorrectes sont stockées dans la base de données. Vous devrez analyser et mettre à jour tous les enregistrements de votre base de données.

5. Ne pas stocker d'informations de chemin redondant dans la base de données

Bien qu'il puisse être tentant d'inclure "Uploads/Photo /" dans l'URL stockée dans la base de données, cela pose également de nombreux problèmes:

a) Ce sont des données redondantes. Pour chaque fichier, vous utilisez un espace de données supplémentaire, inutile. B) Si votre application change et que l'URL change, les URL stockées sont à présent cassées.

Ajoutez plutôt "Uploads/Photo /" à l'URL après avoir lu la valeur de la base de données.

Mettre à jour:

Voici un exemple de code:

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

Cependant, je me méfierais de l’utilisation de votre modèle de données comme modèle d’action MVC.

15
Matt Houser

Vous devriez changer votre AvatarUrl en:

public HttpPostedFileBase AvatarUrl { get; set; }

Dans votre vue, vous pouvez créer un formulaire semblable au suivant. Ajoutez les champs pour lesquels vous acceptez les entrées et utilisez un fichier de saisie pour votre avatar. Lorsque le formulaire est renvoyé au contrôleur, MVC tente de lier les entrées aux paramètres.

@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" />
})

Votre méthode de contrôleur doit être mise à jour pour:

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

Si vous êtes toujours bloqué, faites-le moi savoir et je peux entrer dans les détails.

Il existe également une excellente/détaillée rédaction liée à ce que vous essayez de faire ici http://cpratt.co/file-uploads-in-asp-net-mvc-with-view-models/

1
timothyclifford