locked
Silvverlightでの画像ファイル(ファイル?)の取り扱いについて RRS feed

  • 質問

  • はじめまして。質問させて頂きます。

    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
  • >なかむらさん

    返信ありがとうございます。

           string Path = "D:\\" +  DateTime.Now.ToString("yyyyMMddHHmmss") + ".jpg";

    このような形に直して、試してみましたが駄目でした。

     

    2010年8月2日 6:44
  • サーバー側でファイルの書き込み許可などを設定しても現象が回復しませんでした。」とありますが、 IIS の実行アカウントが保存先のディレクトリにファイルを書き込めるように権限設定を行ったということでしょうか?




    なかむら(http://d.hatena.ne.jp/griefworker)
    2010年8月2日 12:59
  • >なかむらさん

    はい、そうです。

    接続用ユーザーを作成して、書き込みの権限の部分にチェックをしました。

    他に何か設定っていりましたっけ?

     

    2010年8月4日 7:16
  • Dドライブ直下とかって、書き込み権限の設定とかさっくりできましたっけ?
    かずき Blog:http://blogs.wankuma.com/kazuki/
    2010年8月4日 8:30
  • a_かずき_様

    返信ありがとうございます。

    Dドライブ直下の書き込み権限は

    セキュリティーから設定できます。

     

    2010年8月6日 4:35
  • こんにちわ。

    新たに、不明な点が出たため、質問をいたします。

    「SilverlightApplication18.web」-「hoge.Handler1.ashx.cs」の部分で

    例えば、Mainpage.xamlのtextboxの値を使用したい場合などの受け渡し方法が

    分かりませんでした。

    サーバーの方はまだ解決していませんが、IISの設定の部分に問題が

    あるみたいで、それを修正しています。

    引き続きよろしくお願いいたします。

    2010年8月17日 5:23