web-dev-qa-db-ja.com

画像をフォルダに保存し、URLをデータベースに保存する

私はasp.net mvcで非常に初心者です。ここで私は誰もが助けることができるコントローラの画像のアップロードに問題がありましたか?この例のコントローラーはインターネットから取得したもので、viewnyaをどのように変更してコード化する必要がありますか。ここでは、「AvatarUrl」を使用して画像を保存します。

モデル> 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; }
}

コントローラー>従業員コントローラー

    [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

ファイルのアップロード、ローカルファイルシステムへの保存、データベースへの保存は一般的なパターンです。これらは私の推奨事項です。

1。アップロードしたファイル名をファイル名として使用しないでください。

これは一般的です:

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

しないでください。いくつかの理由があります。

a)ファイル名が競合する可能性があります。 b)リモートファイル名は、ローカルファイルシステムと互換性がない場合があります。 c)誰かが悪意のあるファイル名を試し、これを行うとサーバーが破損する可能性があります。

代わりに、独自のファイル名を生成し(おそらくGUID、GUID.NewGuid().ToString()を使用)、元のファイル名をデータベースに保存します。

2。すべてのファイルを1つのフォルダーに保存しないでください

ある時点で、フォルダーに含まれているファイルが多すぎて、OSがすばやく処理できなくなります。

ユーザーIDなどの便利なものでファイルを分割します。これは、ユーザー間でファイルを分離するのにも役立ちます。

。ファイルへの絶対パスをデータベースに保存しないでください

ある時点で、ファイルを(おそらく別のドライブに)移動すると、保存されているすべてのファイルの場所が壊れます。

4。画像のURLをデータベースに保存しないでください

#3と同じ。 Webアプリが変更され、画像のURLを変更したい場合、データベースに誤ったURLが保存されています。すべてのデータベースレコードをスキャンして更新する必要があります。

5。データベースに冗長パス情報を保存しないでください

データベースに保存されているURLに "Uploads/Photo /"を含めたくなるかもしれませんが、多くの問題もあります。

a)冗長なデータです。すべてのファイルについて、余分な不要なデータ領域を使用しています。 b)アプリが変更され、URLが変更された場合、保存されているURLは壊れています。

代わりに、データベースから値を読み取った後、URLの前に「Uploads/Photo /」を追加します。

更新:

ここにいくつかのサンプルコードがあります:

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

ただし、データモデルをMVCアクションモデルとして使用する場合は注意が必要です。

17
Matt Houser

AvatarUrlを次のように変更する必要があります。

public HttpPostedFileBase AvatarUrl { get; set; }

ビューでは、次のようなフォームを作成できます。入力を受け入れるフィールドを追加し、アバターのファイル入力を使用します。フォームがコントローラーにポストバックされると、MVCは入力をパラメーターにバインドしようとします。

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

コントローラメソッドを次のように更新する必要があります。

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

それでも問題が解決しない場合はお知らせください。詳しく説明します。

ここであなたがしようとしていることに関連する優れた/詳細な記事もあります http://cpratt.co/file-uploads-in-asp-net-mvc-with-view-models/ =

0
timothyclifford