私はasp.net mvcで非常に初心者です。ここで私は誰もが助けることができるコントローラの画像のアップロードに問題がありましたか?この例のコントローラーはインターネットから取得したもので、viewnyaをどのように変更してコード化する必要がありますか。ここでは、「AvatarUrl」を使用して画像を保存します。
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);
}
ファイルのアップロード、ローカルファイルシステムへの保存、データベースへの保存は一般的なパターンです。これらは私の推奨事項です。
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アクションモデルとして使用する場合は注意が必要です。
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/ =