WebMatrix で女の子を落とす

執筆日時:

これは羨ましい! わしも女の子落としたい!――できれば、WebMatrix で。

ヤりたいこと

まぁ、あらかじめ女の子を Zip で固めておいてアクセスし、「ほら、落ちてきました!」でもいいんだけど、せっかく WebMatrix でやるんだから圧縮ぐらいはオンデマンドでやってみたい。というわけで、

  • http:// localhost: **** へアクセスすると
  • Grirls フォルダに入っている女の子たちが
  • Zip でまるごと圧縮されて
  • 落ちてくる!(onnanoko.zip)

が今回の目標。

何も考えずに書いてみる

#Default.cshtml /* 全部消して以下のコードに置き換える */

@using System.IO @using System.IO.Compression

@{ string dir = Server.MapPath("~/Girls"); string zip = Server.MapPath("~/Onnanoko.zip");

// ~/Girls を ~/Onnanoko.zip へ圧縮 ZipFile.CreateFromDirectory(dir, zip);

// ~/Onnanoko.zip をダウンロード Response.Redirect("~/Onnanoko.zip"); }

もちろん、これは動かない。WebMatrix 2 で作成される ASP.NET Web Pages は .NET Framework 4 をターゲットとしているけれど、ZipFile クラスは .NET Framework 4.5 で追加されたものだからだ。.NET 4 対応のライブラリを使ってこの問題を解決してもいいのだけど、もう誰かがやってそうな気もする。というわけで、今回は WebMatrix 2 のほうを .NET 4.5 で動かしてみることにしよう。

.NET Framework 4.5 で動作させる

まず初めに考えたのは、Web.config の書き換え。

<?xml version="1.0"?>
<configuration>
<system.web>
// 4.0 を 4.5 に書き換え
<compilation debug="true" targetFramework="4.5">
</system.web>
</configuration>

しかし、これだけでは動かん。System.IO.Compression.FileSystem.dll を参照に追加せねばならないらしい……。くそぅ、どうやればいいんだ……WebMatrix には参照追加のためのユーザーインターフェイスがない……。ここでオレの、オレたちの夢は途絶えてしまうのか!?

お兄ちゃん! 助けて!

f:id:daruyanagi:20121020211304p:plain

そこで思い出したのが、「Visual Studio」。そう、ターンエーの「WebMatrix」のお兄さんだ! まぁ、WebMatrix でもたいていのことはできるけど、やっぱり Visual Studio のほうが便利なところも多い。困ったときはサクッと切り替えるのも一つの手だぞ!

f:id:daruyanagi:20121020211409p:plain

というわけで、参照マネージャーで DLL への参照を追加。すると、Web.config はこんな風に書き換わる。

f:id:daruyanagi:20121020212000p:plain

<?xml version="1.0"?>
<configuration>
<!--
    .NET 4.5 対応のための web.config の変更点の説明については、http://go.microsoft.com/fwlink/?LinkId=235367 を参照してください。

次の属性を <httpRuntime> タグに設定できます。 <system.Web> <httpRuntime targetFramework="4.5" /> </system.Web> –> <system.web> <compilation debug="true" targetFramework="4.5"> <assemblies> <add assembly="System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> </assemblies> </compilation> <pages controlRenderingCompatibilityVersion="4.0"/> </system.web> </configuration>

さすが、ターンエーの「WebMatrix」のお兄さん! っていうか、こんなの手で書いてられるかよ! >w<

あとはこれを実行するだけだ!

親方! 空から女の子が!

f:id:daruyanagi:20121020211631p:plain

てぃーてぃーりりりー♪ てぃてぃーりりりー♬

f:id:daruyanagi:20121020212011p:plain

うおおお! ちゃんと女の子が落せた! 万歳……っ!……万歳っ……!

f:id:daruyanagi:20121020211812p:plain

でも、リロードしたらエラーが発生したので、ちゃんとファイルの存在チェック&削除のロジックを入れておかねばならぬ。

@using System.IO
@using System.IO.Compression

@{ string dir = Server.MapPath("~/Girls"); string zip = Server.MapPath("~/Onnanoko.zip");

if (File.Exists(zip)) { File.Delete(zip); }

ZipFile.CreateFromDirectory(dir, zip);

Response.Redirect("~/Onnanoko.zip"); }

がちゆりさんを足してみた

f:id:daruyanagi:20121020212113p:plain

初回テストでは、Girls フォルダに向日葵ちゃんしか入っていなかったけれど、これはちょっと寂しい。というわけで、複数ファイルも行けるかどうかのテストを兼ねて、Girls フォルダにがちゆりさん(赤座あかねとは (アカザアカネとは) [単語記事] - ニコニコ大百科)を追加。

f:id:daruyanagi:20121020212247p:plain

結果はもちろん成功!

……というわけで、本日のネタは Web サイト/アプリに「Zipでくれ」機能を付ける、でした!

f:id:daruyanagi:20121020212225p:plain

ちなみに、WebMatrix で画像のプレビューをするには「ImageViewer」拡張機能をインストールするんだよ。

おまけ:これ、デプロイできんの?

ローカルで動くのはわかったけど、これリモートでも動くんだろうか。答えは「やれないことはないけれど、もう少し待て」。そのうち Azure Web Sites が .NET 4.5 に対応してくれるみたいだから、それを使えば楽にできそう。 Express Web のほうも対応してくれたらありがたいのだけどね。