- PR -

[ASP.NET]ファイルアップロード機能のクラス化

1
投稿者投稿内容
とせ
会議室デビュー日: 2004/07/15
投稿数: 14
投稿日時: 2005-02-03 14:08
お疲れさまです
クライアントローカルファイルをサーバーへアップロードする処理をクラス化したく、下記のようなコーディングをしました。しかし実行時に「オブジェクト参照がオブジェクトインスタンスに設定されていません」とエラーが発生してしまいます。
デバッグすると、「pf.PostedFile」がNullとなってしまいます
クラス上ではHtmlコントロールの操作はできないのでしょうか?

コード抜粋(WebForm、Class)
’WebForm1(ボタン:cmd1 とHtmlInputFile:pfを配置)
Private clsPostFile as Class1 = New Class1

'ボタンクリック
clsPostFile. m_pvstrFileNM = pf.PostedFile.FileName ’選択したファイル名
clsPostFile.pf_PostFile()            ’Class1の関数 pf_PostFile



’Class1
Inherits System.Web.UI.Page
Public m_pvstrFileNM as String
Public Function pf_PostFile()

Dim pf = New HtmlInputFile
pf.ID = "1"
pf.PostedFile.SaveAs(m_pvstrFileNM)

End Function



環境:VisualStudio.Net2003 + Windows2000 + IIS5.0
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-02-03 14:31
こんにちは。
引用:

とせさんの書き込み (2005-02-03 14:08) より:
デバッグすると、「pf.PostedFile」がNullとなってしまいます
クラス上ではHtmlコントロールの操作はできないのでしょうか?



クラス上で扱えないことはないですが、この場合クラスでわざわざ生成する必要はないです。
そもそも、エラーになっている理由が、クラス側で生成したHtmlInputFileインスタンスのPostedFileプロパティに何も入っていないからです。(フォーム側のコードに記述されているpfとは別物なので)

クラスに渡すのは、ファイル名ではなく、PostedFile(HttpPostedFileクラス)を渡してはどうでしょうか?
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-02-03 14:33
お疲れさまです。

あの、「クラス化」する意味がよく分からないのですが…
部品化したいということなら、普通こうゆう場合、ユーザーコントロールを使うのでは?
とせ
会議室デビュー日: 2004/07/15
投稿数: 14
投稿日時: 2005-02-03 15:28
お疲れさまです
nodera様のご指摘の通りHtmlInputFileを渡す事で解決いたしました

修正コード
コード抜粋(WebForm、Class)
’WebForm1(ボタン:cmd1 とHtmlInputFile:pfを配置)
Private clsPostFile as Class1 = New Class1

'ボタンクリック
clsPostFile. m_pvctrPF = pf ’HtmlInputFileコントロール
clsPostFile.pf_PostFile()        ’Class1の関数 pf_PostFile


’Class1
Inherits System.Web.UI.Page
Public m_pvctrPF = HtmlInputFile

Public Function pf_PostFile()
pf.PostedFile.SaveAs("C:?AAA.txt")

End Function

クラス化したいという意図は
1、実ファイルをアップロード(またはファイル削除)
2、Oracle 履歴テーブルを更新(ストアドプロシージャで処理)
という処理が複数フォームから呼び出される「共通処理」で、
1および2の処理とも引数が同じ値なのでクラス化を考えました。

以上
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-02-03 15:49
引用:

クラス化したいという意図は
1、実ファイルをアップロード(またはファイル削除)
2、Oracle 履歴テーブルを更新(ストアドプロシージャで処理)
という処理が複数フォームから呼び出される「共通処理」で、
1および2の処理とも引数が同じ値なのでクラス化を考えました。



それならば1と2の処理だけ抜き出してクラス化した方がいいですよ。
処理の共通化のためにSystem.Web.UI.Pageクラスを継承して画面ごとクラス化するのは、
MVC的な観点からあまりお薦めできません。
とせ
会議室デビュー日: 2004/07/15
投稿数: 14
投稿日時: 2005-02-03 16:03
引用:

処理の共通化のためにSystem.Web.UI.Pageクラスを継承して画面ごとクラス化するのは、
MVC的な観点からあまりお薦めできません。



ご指摘ありがとうございます
MVCの観点に沿ったクラス設計、心がけたいと思います
1

スキルアップ/キャリアアップ(JOB@IT)