ゲーム開発日誌タイトル画像
IT技術部終了のお知らせ
Windows Server 構築

ASP.NETのファイルをアップロードするFileUploadを使ってみよう



Twitterでシェア
Facebookでシェア
Google+でシェア
はてなブックマークに追加
Pocketで後で読む
投稿日時:2018/04/11 12:17:47
更新日時:

ファイルをアップロードするコントロールを使ってみましょう。ファイル操作はディレクトリを扱っているため少し怖いので、ここで紹介するコードは自己責任で実行をお願いします。

ASP.NETファイルアップロード
MasterForm.aspxにコードを追加するとよいですが、ここでは分かりやすいように新しいフォーム「UploadForm.aspx」を作成しました。

ASP.NETファイルアップロード
ツールボックスにある「FileUpload」のコントロールをドラッグアンドドロップします。更にアップロードボタンを作成したいので、ツールボックスにある「Button」コントロールも配置してください。(ID)をbtnUploadとしました。

FileUploadのコントロールはデフォルトでは一つのファイルのアップロードにしか対応していません。しかし.NET Framework4.5からは標準で複数アップロードする機能が追加されました。その機能を有効にしましょう。

ASP.NETファイルアップロード
FileUploadのコントロールのプロパティで「AllowMultiple」を「True」に変えます。

アップロードボタン(btnUpload)をダブルクリックしてbtnUpload_Clickのメソッドを作成します。
using System;
using System.Web;

using System.IO;

namespace AdminWebSite
{
    public partial class UploadForm : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnUpload_Click(object sender, EventArgs e)
        {
            // アップロードするフォルダを指定
            string path = @"C:\ASPNET\TEST\";
            DirectoryInfo di = new DirectoryInfo(path);
            string fileName = "";

            // pathのフォルダを作成する
            di.Create();

            foreach (HttpPostedFile postedFile in FileUpload1.PostedFiles)
            {
                fileName = Path.GetFileName(postedFile.FileName);
                postedFile.SaveAs(path + fileName);
            }

        }
    }
}
. Windows Serverのデフォルトのサイト表示階層はc/inetpub/wwwrootなのでc/inetpub/wwwroot/image/などのパスでアップロードを行うとよいかもしれません。

動的にアップロードするフォルダを変えるようにしましょうか。

例えば
http://yigao.jp/programming/csharp/1/
の記事を書くとき、ファイルのアップロードパスは
c/inetpub/wwwroot/image/programming/csharp/1/
としたいですね。

コントロールのドロップダウンリストを使うと操作性が上がりそうです。ツールボックスから「DropDownList」をドラッグアンドドロップします。 ここでは3つ作成しました。それぞれ(ID)を下記にしました。

ddlBigCategryName
ddlSmallCategoryName
ddlKijiID

UploadForm.aspxはこちら
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UploadForm.aspx.cs" Inherits="AdminWebSite.UploadForm" %>
< !DOCTYPE html>
< head runat="server">
< /head>
< body>
    


< /body> < /html>
ドロップダウンリストのコントロールが選択されることにより変更された時にそのままではSelectedIndexChangedが発生しません。
ASP.NETファイルアップロード
3つのドロップダウンリストのプロパティで「AutoPostBack」の値を「True」に変更しましょう(上から5番目の項目)。

仕様としましては大カテゴリーのドロップダウンリストが変更された時にそれに合わせて小カテゴリーの値を変更するようにしました。

using System;
using System.Web;
using System.Web.UI.WebControls;

using System.IO;

using mdlDatabase;
using mdlCommon;

using System.Data;
using System.Text;
using System.Data.SqlClient;

namespace AdminWebSite
{
    public partial class UploadForm : System.Web.UI.Page
    {
        DatabaseOpn db = new DatabaseOpn();
        mdlCONST.CONSTOpn cnst = new mdlCONST.CONSTOpn();
        CmnOpn mdlCmn = new CmnOpn();

        // アップロードするフォルダを指定
        string path = @"C:\inetpub\wwwroot\image\";

        protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack == false)
            {
                GET_BigCategoryNameList();
                ddlSmallCategoryName.Items.Add(new ListItem(" - ", "0"));
                GET_KijiID();
                Label1.Text = path;
                return;
            }

        }

        protected void btnUpload_Click(object sender, EventArgs e)
        {
            DirectoryInfo di;
            string fileName = "";

            path = path + ddlBigCategryName.Items[ddlBigCategryName.SelectedIndex].Value.ToString() + "\\" + ddlSmallCategoryName.Items[ddlSmallCategoryName.SelectedIndex].Value.ToString() + "\\" + ddlKijiID.Items[ddlKijiID.SelectedIndex].Value.ToString() + "\\";
            di = new DirectoryInfo(path);

            // pathのフォルダを作成する
            di.Create();

            foreach (HttpPostedFile postedFile in FileUpload1.PostedFiles)
            {
                fileName = Path.GetFileName(postedFile.FileName);
                postedFile.SaveAs(path + fileName);
            }
        }

        protected void ddlBigCategryName_SelectedIndexChanged(object sender, EventArgs e)
        {
            GET_SmallCategoryNameList();
            Label1.Text = path + ddlBigCategryName.Items[ddlBigCategryName.SelectedIndex].Value.ToString() + "\\";
        }

        protected void ddlSmallCategoryName_SelectedIndexChanged(object sender, EventArgs e)
        {
            Label1.Text = path + ddlBigCategryName.Items[ddlBigCategryName.SelectedIndex].Value.ToString() + "\\" + ddlSmallCategoryName.Items[ddlSmallCategoryName.SelectedIndex].Value.ToString() + "\\";
        }

        protected void ddlKijiID_SelectedIndexChanged(object sender, EventArgs e)
        {
            Label1.Text = path + ddlBigCategryName.Items[ddlBigCategryName.SelectedIndex].Value.ToString() + "\\" + ddlSmallCategoryName.Items[ddlSmallCategoryName.SelectedIndex].Value.ToString() + "\\" + ddlKijiID.Items[ddlKijiID.SelectedIndex].Value.ToString() + "\\";
        }

        public void GET_BigCategoryNameList()
        {
            SqlDataReader sqlRdr = null;
            StringBuilder strSql = new StringBuilder();

            strSql.Append("SELECT big_category_name, big_urlroot ");
            strSql.Append("FROM c_big_category ");

            try
            {
                ddlBigCategryName.Items.Clear();

                if (!db.DB_Connect())
                {
                    return;
                }

                if (!db.DB_SqlReader(strSql.ToString(), ref sqlRdr))
                {
                    return;
                }

                while (sqlRdr.Read())
                {
                    ddlBigCategryName.Items.Add(new ListItem(sqlRdr["big_category_name"].ToString(), sqlRdr["big_urlroot"].ToString()));
                }

                return;

            }
            catch (Exception ex)
            {
                return;
            }
            finally
            {
                if (sqlRdr != null)
                {
                    if (!sqlRdr.IsClosed)
                    {
                        sqlRdr.Close();
                    }
                }
                db.DB_Close();
            }
        }

        public void GET_SmallCategoryNameList()
        {
            SqlDataReader sqlRdr = null;
            StringBuilder strSql = new StringBuilder();

            strSql.Append("SELECT small_category_name, small_urlroot ");
            strSql.Append("FROM c_big_category b ");
            strSql.Append("LEFT JOIN c_small_category s ");
            strSql.Append("ON b.big_category_id = s.big_category_id ");
            strSql.Append("WHERE b.big_urlroot = '");
            strSql.Append(ddlBigCategryName.Items[ddlBigCategryName.SelectedIndex].Value.ToString());
            strSql.Append("'");

            try
            {
                ddlSmallCategoryName.Items.Clear();

                if (!db.DB_Connect())
                {
                    return;
                }

                if (!db.DB_SqlReader(strSql.ToString(), ref sqlRdr))
                {
                    return;
                }

                while (sqlRdr.Read())
                {
                    ddlSmallCategoryName.Items.Add(new ListItem(sqlRdr["small_category_name"].ToString(), sqlRdr["small_urlroot"].ToString()));
                }

                return;

            }
            catch (Exception ex)
            {
                return;
            }
            finally
            {
                if (sqlRdr != null)
                {
                    if (!sqlRdr.IsClosed)
                    {
                        sqlRdr.Close();
                    }
                }
                db.DB_Close();
            }
        }

        public void GET_KijiID()
        {
            for (int i = 0; i < 100; i++)
            {
                ddlKijiID.Items.Add(new ListItem(i.ToString(), i.ToString()));
            }
        }
    }
}
デバッグをしてみて大カテゴリー(プログラミング)のドロップダウンリストのコントロールを変えると自動でそれに合った小カテゴリーのドロップダウンリストが生成されました。
ASP.NETファイルアップロード
大カテゴリー「プログラミング」の小カテゴリー「C#」の記事番号「1」に複数のファイルを選択してアップロードしてみると、指定したディレクトリにファイルが作成されていることが確認できると思います。
複数のファイルのアップロードができるようになりました。Windows Server上でアップロードできない場合はディレクトリのアクセス権をIIS_IUSRSに与えて試してみてください。
コメント一覧
お名前:

コメント:
left282802right
 表示されている6桁の数字を入力してください。
 (※スパムコメント対策です。)
00018058