반응형

출근길에...

반응형

<TextBox GotFocus="TextBox_GotFocus" ... / >

using System.Windows.Threading;

private void TextBox_GotFocus(object sender, RoutedEventArgs e)

{

    Dispatcher.CurrentDispatcher.BeginInvoke

    (

        DispatcherPriority.ContextIdle,

        new Action

        (

            delegate

            {

                (sender as TextBox).SelectAll();

            }

        )

    );                 

}



출처: https://shine10e.tistory.com/60 [열이 Blog : )]

반응형

촛불이 우산되어

반응형

 

반응형

전자필기에 관심이 많아서 이것저것 써본결과 가장마음에 드는 디바이스는 '부기보드'계통이었습니다.

일반적인 부기보드는 저렴하지만 저장기능이 지원되는 모델은 10만원을 훌쩍넘기도 하고 사용자들의 이용후기도 

조금 애매한 구석이 있었습니다. 그러던 중 디노10이라는 제품이 눈에 띄어 가격도 상대적으로 저렴하고 해서 질러봤습니다.

 

우선 기본베이스는 전형적인 부기보드입니다.

그런데 특이하게 전용펜을 사용합니다. 그렇다고 다른펜을 사용하면 필기가 안되는 것도 아닙니다.

왜 그런가 하고 살펴보니 전용펜을 통해서 스마트폰으로 테블릿 모드로 연동하기위해 이런방식으로 만들어놓은 모양입니다.

본체는 전형적인 부기보드이고 전용펜을 통해서 스마트폰으로 필기내용을 바로저장할 수 있습니다.

아직 PC와 연결해보지 않았지만 설명서의 내용대로라면 부기보드본체를 PC와 연결하는 것으로 보아 본체도

그냥 부기보드인 것만은 아닌듯 합니다. 그래서 그런지 몰라도 본체도 다른 부기보드들 보다 약간 두껍고

베터리 내장방식입니다.(본체 내장 베터리, 전용펜 내장 베터리)

 

결정적으로 아쉬운 점은 전용펜에 버튼이 달려있는데 스마트폰 연동모드에서 펜굵기를 변경합니다.

필기를 하기위해 전용펜을 파지한 손가락에 버튼이 굉장히 쉽게 눌리는 편이라 테블릿 모드에서 사용에 주의가 필요합니다.

펜굵기가 변하는 순간 필기한 내용이 잠시 끊기기도 하고요...

다른부분은 이해할 수 있지만 전용펜의 불편함은 만만치가 않습니다.

 

아래는 테스트삼아 스마트폰에 테블릿모드로 필기한 흔적입니다.

반응형

출처 : http://www.todayhumor.co.kr/board/view.php?table=humorbest&no=1604245&s_no=1604245&page=1

반응형

복잡한 문제를 해결해야했다.

현상황은 다음과 같다.

두대의 iis가 있다. 한쪽은 WebServer이고 다른한쪽은 ImageServer이다.

골때리는 점은 Web에서 Img로 파일을 업로드할때 파일공유방식으로 전송하고 있다는 점이다.

Web이 \\ImgServerPath 와같이 공유폴더로 접근해서 파일을 업로드하고있다.


문제는 Web서버를 한대 증설하면서 공유폴더방식으로 접근이 안된다는 점이다. GUI단에서는 작업이 되지만

IIS수준에서는 붙지 않아서 파일업로드를 못하고 있다. 이를 해결하기 위해 잔머리를 굴렸다.


그러다가 파일을 Base64String으로 변환해서 POST전송하면 되겠다는 아이디어를 떠올렸다.

어차피 ImgServer도 IIS이므로 동일한 환경으로 세팅이 가능하기에 Img에도 asp.net을 구축할 수 있다.


구현단계에서 발견한 추가문제가 있었다.

5MB이상용량의 파일을 전송할 수가 없었다. 10M이상의 파일을 업로드 하지 못하기 때문에 이를 해결하기 위해 머리를 또 굴렸다.

Base64로 변환된 String은 길이기 길기때문에 잘릴 수도 있겠다 싶었다.

그래서 Base64를 압축해서 전송하면되겠다는 두번째 아이디어를 떠올렸다. 이문제를 며칠 동안 찾아 해맸다.


그리고 해결했다.


절차를 다시 정리하면 다음과 같다.

    1. 파일을 MemoryStream으로 변환(MemoryStream생성과정에 GZipStream을 통해 압축)

    2. MemoryStream을 Base64로 변환

    3. Base64문자열을 POST로 전송

    4. POST로 받은 문자열을 파일로 변환


※ using System.IO.Compression; //GZipStream을 사용하기 위한 선언


A)파일전송


           HttpFileCollection addFile = HttpContext.Current.Request.Files;


           string url = "http://ImgServer.url/Data_send.aspx";

           string sFiles_Name = "";


           string postParm = "";

           string tmpParm = "";

           for (int i = 0; i < addFile.Count; i++)

           {

               HttpPostedFile postedFile = addFile[i];

               if (postedFile.ContentLength > 0)

               {

                   sFiles_Name = postedFile.FileName;

                   Stream sm = postedFile.InputStream;

                   BinaryReader br = new BinaryReader(sm);

                   byte[] byt = br.ReadBytes((Int32)sm.Length);

                   sm.Dispose();

                   br.Close();


                   string base64 = "";

                   

                   using(MemoryStream ms = new MemoryStream())

                   {

                       using (BufferedStream bs = new BufferedStream(new GZipStream(ms, CompressionMode.Compress), (64 * 1024)))

                       {

                           bs.Write(byt, 0, byt.Length);

                       }

                       base64 = Convert.ToBase64String(ms.ToArray());

                   }

                   tmpParm += base64 + '#'; //#은 파일구분자(여러개의 파일을 추가했을경우)

               }

           //POST 파라미터 

           postParm = string.Format("save_data={0}", tmpParm);


           try

           {

               //POST전송

               byte[] datatCategory = UTF8Encoding.UTF8.GetBytes(postParm);

               HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

               req.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";

               req.Method = "POST";

               req.ContentLength = datatCategory.Length;

               Stream requestStream = req.GetRequestStream();

               requestStream.Write(datatCategory, 0, datatCategory.Length);

               requestStream.Close();

               HttpWebResponse httpWebResponse = (HttpWebResponse)req.GetResponse();

               StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.GetEncoding("UTF-8"));

               string rtn = streamReader.ReadToEnd();

               streamReader.Close();

               httpWebResponse.Close();

           }

           catch (Exception ex)

           {

               //throw ex;

           }


B)파일수신(string url = "http://ImgServer.url/Data_send.aspx";에 해당)


           HttpFileCollection addFile = HttpContext.Current.Request.Files;


           string save_data = "";

            

           try

           {

               save_data = Request.Form["save_data"].Replace(" ", "+");    //Replace해줘야함 "+"문자가 " "으로 변환되서 넘어옴

           }

           catch (Exception ex)

           {

               save_data = "";

               Response.Write(ex.Message);

               return;

           }

           

           if (save_data != null && save_data != "")

           {

               string[] aryFiles = save_data.Split("#");

               string svrPath = Server.MapPath(".").Replace("\\", "/");

               for (int i = 0; i < aryFiles.Length - 1; i++)

               {

                   byte[] bytData = Convert.FromBase64String(aryFiles[i]);

                       try

                       {

                           DirectoryInfo di = new DirectoryInfo(svrPath + "/folder");

                           if (!di.Exists)

                           {

                               di.Create();

                           }


                           using(MemoryStream ms = new MemoryStream(bytData))

                           {

                               using(MemoryStream dms = new MemoryStream())

                               {

                                   using(BufferedStream bs = new BufferedStream(new GZipStream(ms, CompressionMode.Decompress),(64*1024)))

                                   {

                                       bs.CopyTo(dms);

                                   }        

                                   using (FileStream fs = new FileStream(svrPath + "/folder/save_filename.file", FileMode.Create, System.IO.FileAccess.Write))

                                   {

                                       byte[] bt = dms.ToArray();

                                       dms.Read(bt, 0, (int)dms.Length);

                                       fs.Write(bt, 0, bt.Length);

                                       fs.Flush();

                                   }

                               }

                           }

                       }

                       catch(Exception ex)

                       {

                           Response.Write("false : " + ex.Message);

                           return;

                       }

               }

               Response.Write("true");

           }



※ 참고 : http://toreaurstad.blogspot.com/2014/01/compressing-byte-array-in-c-with.html

반응형



반응형

System.Web.UI.WebControls.Image obj = new System.Web.UI.WebControls.Image();

System.IO.MemoryStream ms = new System.IO.MemoryStream();

bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

obj.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(ms.ToArray(), 0, ms.ToArray().Length);


기존에는 

Response.BinaryWrite(ms.ToArray());

으로 이미지를 aspx로 뿌리는 방식을 썼었는데 한번에 하나의 파일밖에 뿌릴 수 없어서 방법을 찾아봤다.


출처 : https://www.codeproject.com/Questions/642132/asp-net-displaying-image-from-MemoryStream

반응형

aspx단에 Panel컨트롤 생성

<asp:Panel ID="pnl" runat="server"></asp:Panel>




System.Web.UI.WebControls.Image obj = new System.Web.UI.WebControls.Image();

System.IO.MemoryStream ms = new System.IO.MemoryStream();

bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

obj.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(ms.ToArray(), 0, ms.ToArray().Length);

obj.ID = "img" + ii.ToString();

pnl.Controls.Add(objImg);


Panel에 Image컨트롤을 추가하는 방식

+ Recent posts