酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows ストア アプリでFTPサーバーへのアップロードができない話

この記事は、今現在にリリースされている最新の「Windows 8 Release Preview(Build 8400)」、「Visual Studio 2012 RC」を利用しております。「Windows 8 Release Preview」は開発中のものであることにご留意ください。

MediaCaptureで撮影した画像をFTPサーバーへアップロードしようと考えていました。

Windows PhoneではFtpWebRequestが(たしか)使用できなかったので、「バックグラウンドでのデータの転送 (C#/VB/C++ と XAML を使った Metro スタイル アプリ) 」では、以下のように記載があったのを見つけた時には大変喜びました。

運用ライフサイクル管理ごとのアプリの一時停止の間にバックグラウンドで実行し、アプリの終了後にも持続する操作を可能にする高度なファイル転送機能によって Metro スタイル アプリを拡張するには、Windows ランタイムの Windows.Networking.BackgroundTransfer API を使います。この機能では、HTTP、HTTPS、または FTP プロトコルを使ったファイル転送がサポートされます。

http://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/hh452975.aspx

若干テンションも上がっていましたので、実際にバックグランド転送をやるノリで以下のようなコードを書きました。

    // FTPのパスワードを設定
    var password = new Windows.Security.Credentials.PasswordCredential()
    {
        Password = "user_id",
        UserName = "password"
    };
    // BackgroundUploaderのインスタンスを生成
    var uploader = new Windows.Networking.BackgroundTransfer.BackgroundUploader()
    {
        Method = "POST",
        ServerCredential = password,
    };
    uploader.SetRequestHeader("Filename", "photo.jpg");

    var uri = new Uri("ftp://example.com/");
    var operation = await uploader.CreateUploadFromStreamAsync(uri, memStrm);
    await operation.StartAsync();

上記のコードを実行すると、BackgroundUploaderのCreateUploadFromStreamAsyncメソッドを実行する時点で例外が発生します。

型 'System.ArgumentException' のハンドルされていない例外が mscorlib.dll で発生しました
WinRT 情報: 'uri': Uploading content is only supported for 'http' and 'https' schemes.
追加情報: パラメーターが間違っています。

アップロード先のスキーマは、「http」か「https」でなければいけないようです。同様に海外でも「FTPサーバーへファイルをアップしたいんだけども」と質問している方がいたのですが、FTPClient(FTP操作用のC++実装のライブラリ)とSocketを使って自前で実装しなはれと書かれていました……

2012.7.31 追記

Twitterで教えてもらいました

英語版での記事では記載が消えているらしい……。

This feature supports file transfers using the HTTP and HTTPS protocols.

http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh452975.aspx

oh...