読者です 読者をやめる 読者になる 読者になる

OpenFileDialogを使う

Silverlight IronPython

ファイルを選択させる時には、OpenFileDialogを使う。EnableMultipleSelectionをTrueにすれば複数選択もできるし、Filterを設定すれば拡張子で選択ファイルの絞込みが行える。昔はあったらしいTitleメンバーはSilverlight 2.0ではなくなったらしい。

import System
from System import EventHandler
from System.Windows.Browser.HtmlPage import Document
from System.Windows.Controls import *

def dump_error(func):
    def inner(sender, event):
        try:
            func(sender, event)
        except Exception, e:
            Document.errors.innerHTML = str(e)
    return inner

@dump_error
def upload_Clicked(sender, event):
    opener = OpenFileDialog()
    opener.EnableMultipleSelection = True
    opener.Filter = "Image files (*.jpg;*.png)|*.jpg;*.png"

    if opener.ShowDialog() == DialogResult.OK:
        for info in opener.SelectedFiles:
            Document.msg.innerHTML += info.Name + '<br />'

            stream = info.OpenRead()
            bytes = System.Array.CreateInstance(System.Byte, stream.Length)
            stream.Read(bytes, 0, stream.Length)

Document.upload.AttachEvent("onclick", EventHandler(upload_Clicked))

選択ファイルを読み込んでバイナリを取得できるってことは、Silverlightを使った画像処理アプリケーションとかを作れるな。今回は、最近よく見かけるFlash製のファイル・アップローダーのようなことをやりたかったのだが、.NETでのHTTP POSTの方法がよく分からず、後回し。
ホントに、このページにあるように、HttpWebRequestを使ってContent-Typeをapplication/x-www-form-urlencodedで送出するの?これだと、受け取る側が大変じゃないか?

SilverlightアプリケーションをIronPythonで作る場合のデバッグ手法がよく分からず、今は上のようにデコレータで例外をキャッチしてHTMLに出力するというようなことをやっている。この辺りも研究課題。

もうそろそろ、HTMLをここに貼り付けておく必要も感じなくなってきたけど、上のSilverlightを組み込むHTMLはこんな感じ。

<html>
<head>
<meta http-equiv="Control-Type" content="text/html;charset=utf-8" />
<title>Silverlight Uploader</title>
<script src="http://silverlight.net/quickstarts/Silverlight.js" type="text/javascript"></script>
</head>
<body>

<div>
  <input type="button" id="upload" value="Upload Files" />
</div>

<div id="msg"></div>

<div id="SilverlightControlHost"><script type="text/javascript"><!--
var controlID = "SilverlightControl";
Silverlight.createObjectEx({
  source: "app.xap",
  parentElement: document.getElementById("SilverlightControlHost"),
  id: controlID,
  properties: {
    width : '1',
    height: '1',
    inplaceInstallPrompt: false,
    isWindowless: 'True',
    version: '1.1'
  },
  events: {},
  initParams: "debug=True"
});
//-->
</script></div>
</body>
</html>