質問者
Silvverlightでの画像ファイル(ファイル?)の取り扱いについて

質問
-
はじめまして。質問させて頂きます。
Silverlightでの画像ファイルの取り扱いについて質問します。
開発環境は
・WindowsXP Professional SP3
・VB2010 Professional
でSilverlightの開発を行っております。
既に
http://okwave.jp/qa/q6056494.html
でも質問を行っているのですが、ちょっと急ぎで解決したいのでこちらにも掲載させて頂きます。
やりたいことは
①画像をドラック&ドロップでWeb上に表示
②Webに表示された画像を登録ボタンでサーバーにコピー
③画像のパスをDBにコピー
④別画面で今までの画像と登録した画像を表示
わからない点
・②を行ったときにファイルをサーバーにコピーするためのフルパスを取得しようと下記のようなプログラムを動かした。
Public Sub DropGo1(ByVal sender As Object, ByVal e As System.Windows.DragEventArgs)
txtdrop.Text = String.Empty
Dim myDataObject As IDataObject = DirectCast(e.Data, IDataObject)
Dim dropFiles() As FileInfo = DirectCast(myDataObject.GetData(DataFormats.FileDrop), FileInfo())
For Each fileItem In dropFiles
Dim myImage As Stream = fileItem.OpenRead
Dim myImageSource As New BitmapImage
myImageSource.SetSource(myImage)
Image1.Source = myImageSource
myImage.Close()
imageTextBlock.Text = fileItem.Fullname
txtdrop.Text = fileItem.FullName
Next
End Sub「fileItem.Fullname」の命令でフルパスが取得できるとのことだったが実際に動かした際に
「ファイルの操作は許可されていません。パス''へのアクセスは拒否されました。」
というメッセージが出てエラーになってしまいます。
・フォーム開始時にImageコントロールに画像を表示させようとしているのですがセットの仕方がわからない。
普通にパスを指定するだけだと指定できないのでしょうか?
以上、よろしくお願いいたします。
2010年7月24日 8:29
すべての返信
-
Silverlight では基本的にローカルにあるファイルにアクセスできないので、
- ②と③ではパスをコピーするのではなくて、ファイルをWebにアップロードする
- ④ではアップロードしたファイルのURIをImageコントロールにセットする
といったことをする必要があります。
次のURLが参考になると思います。
なかむら(http://d.hatena.ne.jp/griefworker)- 回答の候補に設定 山本春海 2010年7月29日 6:10
2010年7月24日 22:36 -
1>なかむらさん
返信ありがとうございます。
URLの部分などを参考にして②と③と④の部分のローカルでのテストはできました。
ありがとうございました。
これをサーバーに乗せてみたところ、②のファイルアップロードが上手く出来ない症状が発生しました。
2の部分だけをテストしてみたのですが、やはり同じです。
症状は、指定したフォルダ(.apxファイルがある場所)にテストではアップロードしたファイルが入っていたのですが、
本番だと入りません。サーバー側でファイルの書き込み許可などを設定しても現象が回復しませんでした。
以下コードを乗せます。
「SilverlightApplication18」-「MainPage.xaml.cs」
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.IO; namespace SilverlightApplication18 { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } private void upload_bt_Click(object sender, RoutedEventArgs e) { //とりあえず画像だけ対応してみる OpenFileDialog filedlg = new OpenFileDialog(); filedlg.Multiselect = false; filedlg.Filter = "Image files (*.jpg;*.png)|*.jpg;*.png"; if ((bool)filedlg.ShowDialog()) { UploadFile(filedlg.File.Name, filedlg.File.OpenRead()); } //キャンセルされた else { } } private void UploadFile(string fileName, Stream data) { //ポート番号は自分の環境に合わせて UriBuilder ub = new UriBuilder("http://178.124.1.147:1040/SilverlightApplication18.Web/hoge.ashx"); ub.Query = string.Format("filename{0}", fileName); WebClient c = new WebClient(); c.OpenWriteCompleted += (sender, e) => { PushData(data, e.Result); e.Result.Close(); data.Close(); }; c.OpenWriteAsync(ub.Uri); } private void PushData(Stream input, Stream output) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = input.Read(buffer, 0, buffer.Length)) != 0) { output.Write(buffer, 0, bytesRead); } } } }
「SilverlightApplication18.web」-「hoge.Handler1.ashx.cs」
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.IO; namespace SilverlightApplication18.Web { /// <summary> /// Handler1 の概要の説明 /// </summary> public class hoge : IHttpHandler { string Path = DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg"; public void ProcessRequest(HttpContext context) { using (FileStream fs = File.Create(Path)) { SaveFile(context.Request.InputStream, fs); } } private void SaveFile(Stream stream, FileStream fs) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) != 0) { fs.Write(buffer, 0, bytesRead); } } public bool IsReusable { get { return false; } } } }
以上、再度質問させていただきます。
よろしくお願いいたします。
2010年8月1日 3:25 -
下記のページを参考に実装したんでしょうか?
http://troi.kbc-ehime.ac.jp/kj/?p=1671
このページと同じように、保存先を絶対パスで指定したらどうなりますか?
なかむら(http://d.hatena.ne.jp/griefworker)2010年8月2日 0:36