Gyazo.comクライアント

91 views
Skip to first unread message

Sho Hashimoto

unread,
Oct 4, 2007, 12:53:22 PM10/4/07
to oklab...@googlegroups.com
昼に送ったけどエラーで帰ってくるので再送
------------

http://gyazo.com
というサービスがあって、簡単にスクリーンショットをWebにあ
げられるんだけど、
clientソフトがMac用しかない。

なのでC# VS2005で作ってみていて大体できたんだけど、
POSTしたらhttp 500エラーが返ってきてアップされない。
APIとかもソース読めって感じでupload.cgi(サーバ側)と
upload.rb(クライアント側)が公開されてるだけだったので
適当にソース読んでC#で実装してた。

今回使った技は、
・透明フルスクリーンのウィンドウを作る
 →マウス入力を全部キャンセルするため
・タイマでクリックとクリック離しを監視する
 →Formに対するMouseDown/MouseUpイベントで取ると、
ちゃんとクリックしないと反応しない事があるので
if(Control.MouseButtons == MouseButtons.Left)
を毎回実行

・C#2.0からGraphicsクラスを使ってスクリーンショット
を取れるようになってた
> Image bmp = new Bitmap(1024, 768);
> g = Graphics.FromImage(bmp);
> g.CopyFromScreen(new Point(0,0), new Point(0,0), bmp.Size);
> g.Dispose();
> pictureBox1.Image = bmp; // 表示


・Bitmapをbyte配列に変換する時にBitmapヘッダを
飛ばしたい時は、なぜかJpegを経由するとできる(謎)
> System.IO.MemoryStream ms = new System.IO.MemoryStream();
> bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
> byte[] imgByte = new byte[ms.Length];
> imgByte = ms.ToArray();


やっぱC#だとPOSTのデータを手動で作らないとならないの
で超めんどいですね。
なんかこんだけ行数かけてPOSTした後に、また別に
WebResponseオブジェクト作ってレスポンス受信しなきゃならないんで
すけど…ありえない。

//文字コード
System.Text.Encoding enc =
System.Text.Encoding.GetEncoding("utf-8");
//区切り文字列
string boundary = "----BOUNDARYBOUNDARY----";

//WebRequestの作成
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)
System.Net.WebRequest.Create(url);
//メソッドにPOSTを指定
req.Method = "POST";
//ContentTypeを設定
req.ContentType = "multipart/form-data; boundary=" +
boundary;

DateTime now = DateTime.Now;

//POST送信するデータを作成
string postData = "";
postData = "--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"id
\"\r\n\r\n" +
now.Year+now.Month+now.Day+now.Hour+now.Minute
+now.Second + "\r\n" +
"--" + boundary + "\r\n" + // 区切り
"Content-Disposition: form-data; name=
\"imagedata\"\r\n\r\n" + //
imagedata
imgByte.ToString() + "\r\n\r
\n" + // ここまでimagedata
"--" + boundary + "\r\n" + // 区切り
"Content-type: multipart/form-data\r
\n\r\n";
//バイト型配列に変換
byte[] startData = enc.GetBytes(postData);
postData = "\r\n--" + boundary +
"\r\n";
byte[] endData = enc.GetBytes(postData);


//POST送信するデータの長さを指定
req.ContentLength = startData.Length + endData.Length;


//データをPOST送信するためのStreamを取得
System.IO.Stream reqStream = req.GetRequestStream();
//送信するデータを書き込む
reqStream.Write(startData, 0, startData.Length);

fs.Close();
reqStream.Write(endData, 0, endData.Length);
reqStream.Close();


--
橋本 翔(Sho Hashimoto)
sho...@sfc.keio.ac.jp
http://shokai.org/


upload.cgi
upload.rb

Sho Hashimoto

unread,
Oct 4, 2007, 12:56:40 PM10/4/07
to oklab...@googlegroups.com
作った奴が添付できない

Sho Hashimoto さんは書きました:

Web <http://shokai.org/>
MSN <un...@msn.com>
携帯 <090-9344-2119>

Yusuke Wada

unread,
Oct 4, 2007, 7:26:42 PM10/4/07
to oklab...@googlegroups.com
>> やっぱC#だとPOSTのデータを手動で作らないとならないの
>> で超めんどいですね。

そなんだ。Perlだと楽チンだけどね。
BaseなんちゃらでエンコードさせてからPOSTでしょ。

わだ

Sho Hashimoto さんは書きました:


--
Yusuke Wada / 和田裕介 <yus...@kamawada.com>
web <http://kamawada.com/~yusuke>

Reply all
Reply to author
Forward
0 new messages