2007年05月07日

動的にフォルダを作成し、ファイルをアップロード

ファイルアップロードのサンプルはヘルプを含め、いろんなところに掲載されている。でもほとんどが固定されたフォルダにアップするようになっている。
これを任意のフォルダ(と言ってもアクセス可能な)に動的に作成したフォルダへアップしたいときにどうすれば良いか。
ASP.NET以前の旧ASPでWebアプリを作ったときは「FileSystemObject」を使ってサーバー上のドライブやフォルダを操作していた。それが今回使えるかどうか試してみたら、何の問題も無く使えた。同時にASP.NET時代の方法も試してみた。こちらも当然問題無く可能だ。

補足:
このTipsを公開直後、かるあさんから指摘がありましたFileSystemObjectを使った場合のCOM参照の開放を追加しました。
COMオブジェクトの管理についてはMicrosoftのこちらのページを参考にご覧ください。→相互運用機能アセンブリを使った複雑な COM オブジェクトの処理

'フォルダ名に日時を使った文字列を使用
Dim mFolder As String = Format(Now, "yyyyMMdd-HHmmss")

・FileSystemObjectを使ったフォルダ作成
Dim FSO As Object
FSO = Server.CreateObject("Scripting.FileSystemObject")
If FSO.folderExists("C:\Uploads\" & mFolder) = False Then
FSO.createfolder("C:\Uploads\" & mFolder)
End If
FSO = Nothing
KillComObject(FSO)
 
'COM オブジェクトの使用後、明示的に COM オブジェクトへの参照を解放する
Private Sub KillComObject(ByRef comObj As Object)
Try
'提供されたランタイム呼び出し可能ラッパーの参照カウントをデクリメントします
If Not comObj Is Nothing AndAlso System.Runtime.InteropServices. _
Marshal.IsComObject(comObj) Then
Dim cnt As Integer
Do
'COM オブジェクトが確実に解放されるようにするには、
'ループを作成し、返される参照カウントが 0 になるまで実行
cnt = System.Runtime.InteropServices.Marshal.ReleaseComObject(comObj)
Loop Until cnt <= 0
End If
Catch
Finally
'参照を解除する
comObj = Nothing
End Try
End Sub


・System.IOを使ったフォルダ作成
Dim target As DirectoryInfo = New DirectoryInfo("C:\Uploads\" & mFolder)
If target.Exists = False Then
target.Create()
End If

サンプルはこちら→UploadTest.lzh

注:サンプルはIISでアップロード専用フォルダを仮想ディレクトリとして設定している。これは、Webアプリケーションのコンテンツフォルダとは別ドライブに配置した場合を想定したもの。

サンプル動作画面

1.起動画面
起動画面

2.FileSystemObjectを使ったフォルダ作成によるアップロードFileSystemObjectによるフォルダ作成

3.System.IOを使ったフォルダ作成によるアップロードSystem.IOによるフォルダ作成


posted by なっちゃん at 11:17| 静岡 ☔| Comment(4) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
FileSystem オブジェクトを使うなら COM の解放が必要なのではないでしょうか?
Posted by かるあ at 2007年05月07日 13:41
ご指摘ありがとうございます。
あまり深く考えずに、動けばいいや(^^;としていましたが、時々変なメッセージが出るのでなんか関係あるかなぁと思っていました。
「ReleaseComObject」を使うんですね。サンプルを見つけたので修正します。
Posted by なっちゃん at 2007年05月07日 14:29
サンプルのUploadTest.lzhをダウンロードしたのですが、
解凍すると、「UploadTest.lzh.ps」になって使えません。
Posted by きよよん at 2009年07月02日 09:50
ダウンロードすると拡張子がPSになっています。
いつからそうなったのか私には判りませんが、元のLZHに変更すれば普通に解凍できますよ。
Posted by なっちゃん at 2009年07月02日 10:33
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。