ASP.NET MVCでの複数の画像+テキストフィールドのアップロード
-
03-07-2019 - |
質問
私はASP.net MVCを初めて使用するので、回答で可能な限り説明してください:)
私がやろうとしていることを単純化させてください。車に関する情報を入力するフォームがあるとします。フィールドには、Make、Model、Year、Image1、Image2があります。
フォームの下部には、「保存」があります。ボタン。関連付けられたControllerメソッドは、Image1とImage2をディスクに保存し、それらのファイル名を取得し、それらを車のモデルに関連付け、データベースに保存します。
アイデアはありますか
みんなありがとう!
編集
winob0t が私を捕まえたそこのほとんどの方法。唯一の未解決の問題は次のとおりです。Image1とImage2は必須フィールドではないため、0、1、または2つの画像を保存できるようになりました。しかし、ユーザーが画像を1枚しかアップロードしない場合、その画像がimageUpload1またはimageUpload2からのものかどうかを知る方法がありません。
また、どんな助けでも大歓迎です!
解決
コントローラーでは、アップロードされたファイルに次のようにアクセスできます。
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;
}
テキストフィールドは、通常どおりRequest.Form [...]などのコントローラーアクションに到着します。また、フォームのenctypeを「multipart / form-data」に設定する必要があることに注意してください。 ASP.NET MVCについて十分理解しているので、残りの作業を行うことができます。また、次のようにフォームタグをaspxビューで宣言できることにも注意してください。ただし、必要に応じて、従来のアプローチを使用することもできます。
<% using(Html.BeginForm<FooController>(c => c.Submit(), FormMethod.Post, new { enctype = "multipart/form-data", @id = formId, @class = "submitItem" })) { %>
<% } %>
他のヒント
ここに私の解決策がありますが、上記の答えは私の状況ではうまくいきませんでした。フォームの詳細については何も気にせず、複数のアップロードを許可します。
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);
}
}