0

PHP での経験は豊富ですが、ASP.net は初めてです。Web でここまでのチュートリアルをいくつか見つけましたが、現在問題が発生しています。

私が達成しようとしていることを要約すると、ユーザーにコンテスト エントリを送信してもらいたいページがあります。HTML フォームを使用して、エントリのタイトル、説明などを収集し、エントリを表す画像を送信できるようにしたいと考えています。

彼らが画像を提供することを選択した場合、//entries//entry-image のようなパスを使用してアップロードしたいと考えています。

私のデータベースは、画像パスを表す varchar を保持するだけです。ファイルのサイズを制限したり、特定のファイル拡張子のみを許可したりするなど、ファイルのアップロードにも明確な検証を追加したいと考えています。画像は何らかの標準名 (上記のパスの「entry-image」など) で保存し、そのエントリ ディレクトリに既に存在する可能性のある画像を上書きする必要があります。

現在、HTML フォームからテキスト入力を取得することは問題ではありませんが、ファイルを取得することは問題です。現在、フォームの検証はまだ行われておらず、最も基本的な状態で機能するようにしようとしています。これが私のHTMLの切り詰められたバージョンです:

<form method="post" action="../Entry/Create">
            <input type="text" id="EntryTitle" name="EntryTitle" />
            <p id="char-remaining">(100 characters remaining)</p>

            <input type="text" id="EntryVideo" name="EntryVideo" />
            <p id="vid-desc">(URL of the Video to Embed)</p>

            <input type="file" id="ImageFile" name="ImageFile" />
            <p id="file-desc">(200x200px, jpeg, png, gif)</p>

            <textarea id="EntryDesc" name="EntryDesc"></textarea>
            <p id="entry-desc"></p>
            <button id="new-entry-save">save</button>
</form>

次に、EntryController クラスの Create アクションを次に示します。

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

いくつかの行がコメントアウトされていることに気付くでしょう。コメントアウトしたままにすると、テキスト入力値は問題なく受信され、データベースに保存されます。ただし、コメントを付けないままにしておくと、コメントアウトされた最初の行で NullReferenceException がスローされます。

私のアクションで使用しているコードは、ほとんどチュートリアルからコピーして貼り付けたものであり、ファイル拡張子やファイル名を標準的なものに変更します。

だから私の主な質問は次のとおりです。

1.) 実際には HTML フォームでファイルを提供しているのに NullReferenceException を受け取るのはなぜですか?

2.) 提出されたファイルを検証するにはどうすればよいですか? (サイズ、延長、寸法など)

3.) ファイルの名前を「entry-image」などに変更するにはどうすればよいですか?

4

2 に答える 2

2

上記の2番目の答えは次のとおりです。

そのビューの送信アクションでJavaScript関数を呼び出します

<input type="submit" id="thePageSubmit" value="Upload" onclick="return IsValidExtention();" /> 

次に、Javascript機能で次のようなことを行います

    function IsValidExtention() {
        var it = document.forms[0].elements["ImageFile"].value;
        it = it.substring(it.lastIndexOf('\\') + 1);
        if (it.length > 0) {
            if (it.toLowerCase().indexOf(".exe")!=-1) {
                alert("We are unable to upload .exe files.");
                return false;
            }
            if (it.toLowerCase().indexOf(".js") != -1) {
                alert("We are unable to upload .js files.");
                return false;
            }
        }
        else{
            return false;
        } 
        return true;
    }
于 2012-04-04T22:48:32.093 に答える
1

まだ存在しない場合は、enctype="multipart/form-data"属性をフォーム要素に追加します。

于 2012-04-04T22:37:25.530 に答える