おでんはじめました。

required ちくわぶ and 巾着,optional はんぺん.

バイナリファイルを文字列でサーバーへ転送する

バイナリファイルを添付でなく文字列でサーバーへ転送する方法を調べたのでメモ。

バイナリファイルを文字列に変換するのはunpackを使用する。

$str = unpack("H*", $binary);

試しにZIPファイルを読み込んで文字列に変換してみる。

$binary = file_get_contents('sample.zip');
$str = unpack("H*", $binary);
echo $str;

こんな感じ。

504b0304140008000800a6b86a420000000000000000000000000800 10006c6973742e786d6c55580c006fe6a95418933c ...略

これをバイナリに戻すのは、

$binary_string = pack("H*" , $str[1]);  //配列になっているので注意

これをファイルに保存すれば復元される。

if ( !$handle = fopen('new.zip', 'w') ){
  echo "Cannot create file";  //権限注意(777とか)
  exit; 
}
if ( fwrite($handle, $binary_string ) === FALSE ){
  echo "Cannot write file";
  exit;
} 
fclose( $handle );

ここまでできればPOSTでバイナリの文字列を渡せば転送できるはず。

次はこれを使ってC#からサーバーへバイナルファイルを転送してみる。

参考: バイナリ データの処理

Excel/C#でdynamic型からWorksheet型へキャストができない

はまったのでメモ。
ExcelC#で扱ってて.Net Framework4.0に上げたら、

Workbook book;
...
((Worksheet)book.Sheets[1]).SaveAs(path);

コンパイル通らないけど、

book.(Sheets[1] as Worksheet).SaveAs(path);

は通る。

error CS1969: 動的な式のコンパイルに必要な 1 つ以上の型が見つかりません。参照が指定されていることを確認してください。

そもそもキャストしないでも動くはずなのだけど、SheetとWorksheetと_Worksheetの型があるからこれが原因でキャストが必要なのか?
dynamicの仕組みがよくわからないのでまた後日調べる。

参考:
読ませてもらったけど難しい。
Excel遅延バインディング : ヒロの趣味ブログ

HTTPWebRequest.Createがネットワーク上で動かない(ことがあるらしい)

HTTPWebRequest.Createが動作せずどっぷりはまってしまったのでメモ。

System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)
  System.Net.WebRequest.Create("http://www.yahoo.co.jp");

これを実行すると例外が発生。

以下が出力されたエラー。

Message='system.net/defaultProxy' 構成セクションで指定された Web プロキシの作成中にエラーが発生しました。 
data=System.Collections.ListDictionaryInternal Source=System StackTrace= 
場所 System.Net.Configuration.DefaultProxySectionInternal.GetSection()
場所 System.Net.WebRequest.get_InternalDefaultWebProxy()
場所 System.Net.HttpWebRequest..ctor(Uri uri, ServicePoint servicePoint)
場所 System.Net.HttpRequestCreator.Create(Uri Uri)
場所 System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase)
場所 System.Net.WebRequest.Create(Uri requestUri)
場所 System.Net.SafeCloseSocketAndEvent.CreateWSASocketWithEvent(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType, Boolean autoReset, Boolean signaled)
場所 System.Net.NetworkAddressChangePolled..ctor()
場所 System.Net.AutoWebProxyScriptEngine.AutoDetector.Initialize()
場所 System.Net.AutoWebProxyScriptEngine.AutoDetector.get_CurrentAutoDetector()
場所 System.Net.AutoWebProxyScriptEngine..ctor(WebProxy proxy, Boolean useRegistry)
場所 System.Net.WebProxy.UnsafeUpdateFromRegistry()
場所 System.Net.WebProxy..ctor(Boolean enableAutoproxy)
場所 System.Net.Configuration.DefaultProxySectionInternal..ctor(DefaultProxySection section)
場所 System.Net.Configuration.DefaultProxySectionInternal.GetSection() msg=無効な引数が提供されました。<br />

プロキシは設定してないし、無効な引数ってのはArgumentExceptionかと調べたけどそれも違う。

そしたらなんてことはないプログラムを動作させているマイドキュメントのフォルダがネットワーク上にあり、これをローカルに移動したらまさかまさか動いた。

シンクライアントなので権限が足りないのかそこらへんが理由っぽい(そこまでつきとめられず)。

参考にしたサイト:

WebRequest.Create defaultproxy exception - Google 検索

マイクロソフトの仕様なのかバグなのか。

追伸:Xenappとかシンクライアントってほんと嫌い。