0

誰かが以下の私のコードを変更して、これを私が望むことを実行する方法を正確に示すことができることを願っています。

次のアクションに投稿するHTMLフォームがあります。

public ActionResult Create(string EntryTitle, string EntryVideo, HttpPostedFileBase ImageFile, string EntryDesc)
    {
        if (Session["User"] != null)
        {
            User currentUser = (User)Session["User"];

            string savedFileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, Path.GetFileName(ImageFile.FileName)); 
            ImageFile.SaveAs(savedFileName);

            Entry newEntry = new Entry();

            newEntry.Title = EntryTitle;
            newEntry.EmbedURL = EntryVideo;
            newEntry.Description = EntryDesc;
            newEntry.ImagePath = savedFileName;
            newEntry.UserId = currentUser.UserId;

            db.Entries.Add(newEntry);
            db.SaveChanges();


        }

        return RedirectToAction("MyPage", "User");
    }

これにより、イメージがルートソリューションディレクトリに保存されます(または、許可がなく、代わりに例外がスローされます)。

私がやりたいことは次のとおりです。

1.)ファイルサイズが最大値を下回っていることを確認します。たとえば、今のところ500kbとします。

2.)ファイルサイズに問題がない場合は、次のディレクトリに保存します

mywebsite.com/uploads/<userid>/<entryid>/entry-image.<jpg/png/gif>

別のファイル拡張子(.jpeg、.jpg、.png、.gif)を受け入れたいので、ファイルの名前を変更する方法がわかりません。または、上記のように正しいディレクトリに配置する方法がわからない。または、ファイルサイズを検証する方法。ユーザーがIEを使用している場合にのみ、JavaScriptでしか検証できないようです。

4

2 に答える 2

1

1. ファイル サイズが最大値を下回っていることを確認します。ここでは 500kb とします。

HttpPostFileBase.ContentLengthプロパティを使用して、ファイルのサイズ (バイト単位) を取得できます。

if (ImageFile.ContentLength > 1024 * 500) // 1024 bytes * 500 == 500kb
{
    // The file is too big.
}

2.ファイルサイズは問題ないと仮定し、以下のディレクトリに保存します

string savedFileName = Server.MapPath(string.Format("~/uploads/{0}/{1}/entry-image{2}",
    currentUser.UserId,
    newEntry.EntryId,
    Path.GetExtension(ImageFile.FileName)));

私が見る唯一の問題は、 Entry.EntryId がデータベースで生成される可能性があるため、生成されるまで保存パスの一部として使用できないことです。

于 2012-04-05T23:17:30.533 に答える
0

これが役立つか、少なくとも正しい方向に向けられることを願っています

    if (ImageFile.ContentLength < 1024 * 500)
            {
                Entry newEntry = new Entry();

                newEntry.Title = EntryTitle;
                newEntry.EmbedURL = EntryVideo;
                newEntry.Description = EntryDesc;
                newEntry.UserId = currentUser.UserId;

                db.Entries.Add(newEntry);
                db.SaveChanges();  //this helps generate an entry id

                string uploadsDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "uploads");
                string userDir = Path.Combine(uploadsDir, <userid>);
                string entryDir = Path.Combine(userDir, newEntry.EntryID );

                if (Directory.Exists(userDir) == false)
                    Directory.CreateDirectory(userDir);

                if (Directory.Exists(entryDir) == false)
                    Directory.CreateDirectory(entryDir);

               string savedFileName = Path.Combine(entryDir, <entry-image>);
               ImageFile.SaveAs(savedFileName);

               newEntry.ImagePath = savedFileName;  //if this doesn't work pull back out this entry and adjust the ImagePath
               db.SaveChanges();

            }

「アップロード」ディレクトリへの書き込み権限を付与する必要があります。

web.config から Web アプリのファイル サイズを制限することもできます。

    <system.web>
       <httpRuntime   maxRequestLength="500"/>
于 2012-04-05T23:44:51.377 に答える