月: 2012年12月

  • ASP.NET(VB)アップロードされたファイルをDBに保存する方法

    ASP.NETでアップロードされたファイルを、DBに格納する方法のメモ。

    開発をしていて、データの保存場所に困ることがある。
    フォルダにそのまま格納しておくと分散が大変とか、
    ファイルの管理が大変とか、いろいろな悩みがあるだろう。
    その時の選択肢としてよく上がるのが、DBをストレージとして使う方法だ。
    ファイルとしてフォルダに置くのではなく、DBに格納し必要な時にSQLで取り出す。
    データはDBに保存してあるので、DBのバックアップを取っておけばOK。
    DBのパフォーマンスは気になるが、選択肢としてあるだろう。

    そんなとき、ASP.NETでアップロードされたファイルを直接DBに保存する。
    ファイルとしてサーバ上に置かなくていいので、ゴミもできない便利な方法だ。

    ■画面側

    まず、ASPX側にはFileUploadコントロールを配置する。(これのIDはFileUpload1とする)
    これで、ファイルを指定するボタンとファイルが指定されるテキストボックスができる。

    ■VB側の処理

    FileUploadコントロールのPostedFile.InputStreamメソッドでアップロードされたファイルを
    Streamオブジェクト(バイトデータ)として読み込むことができる。
    ただ読むことができる、いってもそのままDBに格納できるわけではないので、
    一度、変数に読み取ったバイトコードを格納し、それをSQLパラメータにいれる。
    わかってしまえば、どうということはない処理だ。

    ■サンプルコード

     Try
         'SQL Connectionの作成(参考:マスタページ側で処理してる)
         Dim dbCon As SqlConnection = New SqlClient.SqlConnection
         dbCon.ConnectionString = ConfigurationManager.ConnectionStrings("DBconnect").ConnectionString
         dbCon.Open()
         
         'Transactionの作成(参考:マスタページ側で処理してる)
         Dim dbTrans As SqlTransaction
         dbTrans = dbCon.BeginTransaction(IsolationLevel.ReadCommitted)
          
          
         'DBには、VarBinary型もしくはimage型のFileDataというカラムがある想定
          Dim sql As String = "INSERT INTO FileStorage (FileData) VALUES (@file)"
          
          Dim command As SqlCommand = New SqlCommand(sql, dbCon, dbTrans)
          
          'Byteデータとしてアップロードされたファイルを読み込む
          Dim binaryData(FileUpload1.PostedFile.InputStream.Length) As Byte
          FileUpload1.PostedFile.InputStream.Read(binaryData, 0, FileUpload1.PostedFile.InputStream.Length)
          command.Parameters.Add("@file", SqlDbType.VarBinary).Value = binaryData
          
         'SQLの実行
         Dim result As String
         result = command.ExecuteNonQuery()
         
         'SQL Connectionを閉じる。
         dbCon.Close()
     Catch ex As Exception
         dbCon.Close()
         
         Response.Write("失敗。。。")
     End Try
    
  • ASP.NET(VB) アップロードされたファイルがPDFファイルかどうか判別する方法

    ASP.NETでアップロードされたファイルの種類を判別する方法のメモ。
    拡張子で判別するなら、バリデーションコントロールを使ったほうが楽だが、
    ここではmimeタイプを使って判別する方法を書く。

    ■ASPX側

    まず、ASPX側にはFileUploadコントロールを配置する。(これのIDはFileUpload1とする)
    これで、ファイルを指定するボタンとファイルが指定されるテキストボックスができる。

    ■VB側の処理

    FileUploadコントロールのHasFileメソッドを使い、ファイルが指定されているかを判別する。
    次に、PostedFile.ContentTypeメソッドを使い、アップロードされたファイルのmimeタイプを取得し、
    mimeタイプが”application/pdf”であるかを判別する。
    (PDFファイルがアップロードされた場合、mimeタイプはapplication/pdfになる)

    ■サンプルコード

     'ファイルが指定されているかどうかの判別
     If FileUpload1.HasFile Then
         'PDFファイルが指定されているかどうかmimeタイプから判別する
         If FileUpload1.PostedFile.ContentType = "application/pdf" Then
             'PDFファイルだった場合は、ここの処理を実行する
     
     
         End If
     End If
    
  • 中国のグレートファイアウォールが強化されVPN遮断かも?

    クリスマス・イブに届いたうれしくないニュースだ。中国のネットワークとインターネットの間にあるファイアウォール、それがグレートファイアウォール。(なんか変な表現だな・・・、他になんというべきだろうか。)これを使って、中国政府は都合の悪いウェブサイトへの通信を遮断する。最近だと、SNSやSkypeなどが規制されている(されたいた?)。数回、中国にいったことがあるが、このグレートな壁の所為で通信は安定しなかった。この迷惑な検閲システムが、さらに強化されるようだ。

    グレートファイアウォールが強化されて、今度はVPNについても 制限が行われるようだ。中身を傍受されることがあるのかないのかはわからない。ニュース記事によると、VPN接続の速度低下や切断があるとのこと。これが本当なら、中国の拠点と拠点間VPNを使用している企業は困ることになる。VPN上で、IP電話で通話していたものが使い物にならなくなったり、社外秘のデータのやり取りが困難になってくる。前々から、カントリーリスクの大きい国とは思っていたが、ここにきて更に危ない国になっている。中国での人件費もあがりつつし、この先、わざわざ中国でビジネスしなくてもいいだろう。

    ところで、Arcstar IP-VPNとかのサービスでも影響を受けているのだろうか。国内キャリアが提供しているサービスへの影響がとっても気になる。

    http://www.afpbb.com/article/environment-science-it/it/2917958/10022074

  • HTTP2.0のファーストドラフト公開の話

    もう1ヶ月も前の話だが、HTTPの次世代規格であるHTTP2.0のファーストドラフトが公開された。

    今、特に気にせずに使っているHTTPは1.1だ。これは1999年にRFCが提出された。自分がコンピュータを使い始めたのが2000年、HTMLやウェブについて勉強を始めたのが2001年だ。気にする前に決まっていれば、今のHTTP1.1が当たり前に感じるわけだ。そのHTTPの次世代規格がHTTP2.0だ。

    この10数年でHTTPを使った通信は、人々の暮らしを支えるものとして、無くてならないものになった。ウェブの閲覧はもちろんのこと、スマートフォンのアプリでつかっていたり、ゲームでもなんでも使っている。使い方も変わってきているし、今のHTTP1.1では限界が見えているから今、HTTP2.0の策定を行う必要があるのだろう。ユーザが使っている分には、HTTP1.1かHTTP2.0かは意識する必要はないだろうけど、エンジニアとしてはかなり大きな変化になるだろう。1.1から2.0への移行期の混乱やHTTP2.0を使ったアプリケーション開発、それからサーバの設定などなど。楽しそうな未来が待っていそうだ。

    まぁ、どこまでスムーズに移行されていくのかが心配だけど。時代に乗り遅れないように情報を集めたり、勉強したりしなくては。技術の世界は、ちょっとの油断でついていけなくなる。今でも、時代の最先端に追いつけていないわけで、これ以上、乗り遅れていきたくはないものだ。環境的な要因はあるものの最終的には個人の問題だし。

    また、HTTP2.0は利害関係なども含めて簡単には決まりそうも無い。いろいろな案があるので、まとめていくのは大変だろう。今のところ気になっているのは、HTTP2.0のベースになっているSPDYとHTTP2.0でTLSが必須になるのかというあたり。他はよくわからないので、何ともいえない。(ちゃんと調べろよ、といえばそれまでだけど。)

    ■参考URL

    今更とは思うが、HTTP2.0の話は書こうと思っていて仕事の忙しさを理由に書いていなかった。ブログなので、後から見返したり検索したりするので備忘録として書いておく。

  • Windows Server 2008 R2のライセンス再認証について

    Windows Server 2008 R2では、サーバのハードウェア構成を変更した際に再度ライセンス認証を求められる。ライセンス認証はデバイスドライバに変更があると、もう一度、正規のWindowsライセンスかどうかを認証するというものだ。

    ライセンスの認証を求められる場合は、画面の右下にライセンス認証を求めていくるポップアップが上がってくる。これがいつ上がってくるのかは不明だ。そのため、”サーバー マネージャー”を開いて、”サーバーの概要”のプロダクトIDを見るとよい。ライセンス認証されているかどうかが、ここに表示される。(認証済みの場合には、ID番号とともにライセンス認証済みと表示されている)

    ここで認証されていない旨が表示されている場合、ライセンス認証を行う。ライセンス認証は、”サーバーの概要”画面の右側に表示される。このメニューは、ライセンス認証済みの場合には表示されないので注意。

    ライセンス認証のメニューをクリックすると、ライセンスキーを入力する画面がポップアップで表示される。ライセンスキーの項目は、空のまま、”次へ”をクリックする。するとライセンス認証が実行され正規のライセンスであれば、認証される。

    この画面で、ライセンスキーを求められるのでライセンスキーを探してしまいがちだが、一度ライセンス認証したものであれば、表示はされていないが内部にキーをもっているので”次へ”ボタンを押すことができる。

    今回、ハマったのは仮想サーバのWindows Server 2008 R2を別のホストに移動させたところ、ネットワークアダプタが変更された。そのため、デバイスドライバに変更があり、再度、ライセンス認証を求めれた。当然、手元にライセンスキーはなく、あたふたとしてしまった。