it-swarm.com.de

Möchten Sie ein Bild in einem Ordner speichern und die URL in der Datenbank speichern

Ich bin sehr neuling in asp.net mvc. Hier hatte ich ein Problem mit dem Controller-Image-Upload. Kann mir jemand helfen? Dieses Beispiel Controller bekomme ich aus dem Internet, was soll ich ändern und viewnya Code, hier möchte ich das Bild über "AvatarUrl" speichern

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

Controller> EmployeesController

    [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

Das Hochladen einer Datei, das Speichern im lokalen Dateisystem und das Speichern in einer Datenbank ist ein übliches Muster. Das sind meine Empfehlungen.

1. Verwenden Sie den hochgeladenen Dateinamen nicht als Dateinamen.

Das ist üblich:

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

Tu es nicht. Dafür gibt es einige Gründe:

a) Dateinamen können in Konflikt stehen. b) Remote-Dateinamen sind möglicherweise nicht mit Ihrem lokalen Dateisystem kompatibel. c) Jemand kann einen böswilligen Dateinamen verwenden, wodurch der Server beschädigt werden kann.

Generieren Sie stattdessen Ihren eigenen Dateinamen (möglicherweise mithilfe einer GUID, GUID.NewGuid().ToString()) und speichern Sie den ursprünglichen Dateinamen in Ihrer Datenbank.

2. Speichern Sie nicht alle Dateien in einem einzigen Ordner

Zu einem bestimmten Zeitpunkt enthält Ihr Ordner zu viele Dateien, um vom Betriebssystem schnell verarbeitet zu werden.

Partitionieren Sie die Dateien nach etwas Nützlichem wie der Benutzer-ID. Dies hilft auch, die Dateien zwischen Benutzern zu trennen.

3. Speichern Sie nicht den vollständigen Pfad zur Datei in der Datenbank.

An einem bestimmten Punkt können Sie die Dateien verschieben (möglicherweise auf ein anderes Laufwerk) und alle Ihre gespeicherten Dateispeicherorte werden beschädigt.

4. Speichern Sie die Bild-URL nicht in der Datenbank

Gleich wie bei # 3. Wenn sich Ihre Web-App ändert und Sie die Bild-URLs ändern möchten, haben Sie falsche URLs in der Datenbank gespeichert. Sie müssen alle Ihre Datenbankeinträge scannen und aktualisieren.

5. Speichern Sie keine redundanten Pfadinformationen in der Datenbank

Es kann zwar verlockend sein, "Uploads/Foto /" in die gespeicherte URL in die Datenbank aufzunehmen, hat aber auch viele Probleme:

a) Es sind redundante Daten. Für jede Datei verwenden Sie zusätzlichen, unnötigen Datenbereich. B) Wenn sich Ihre App ändert und die URL geändert wird, sind Ihre gespeicherten URLs jetzt beschädigt.

Fügen Sie stattdessen "Uploads/Photo /" der URL voran, nachdem Sie den Wert aus der Datenbank gelesen haben.

Update:

Hier ist ein Beispielcode:

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

Ich würde jedoch vorsichtig sein, wenn Sie Ihr Datenmodell als MVC-Aktionsmodell verwenden.

15
Matt Houser

Sie sollten Ihre AvatarUrl ändern in:

public HttpPostedFileBase AvatarUrl { get; set; }

In Ihrer Ansicht können Sie ein Formular ähnlich dem folgenden erstellen. Fügen Sie die Felder hinzu, für die Sie Eingaben akzeptieren, und verwenden Sie eine Dateieingabe für Ihren Avatar. Wenn das Formular an die Steuerung zurückgesendet wird, versucht MVC, die Eingaben an die Parameter zu binden.

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

Ihre Controller-Methode sollte aktualisiert werden:

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

Wenn du immer noch feststeckst, lass es mich wissen und ich kann ins Detail gehen.

Es gibt auch eine exzellente/ausführliche Beschreibung, die Sie hier finden. Http://cpratt.co/file-uploads-in-asp-net-mvc-with-view-models/

1
timothyclifford