記事投稿よりもXMLがない分、コードはスッキリしているのですが、逆に悩みました。
他にAtom Pubに対応しているso-netやはてななどの仕様をみてみると、XMLで画像データはbase64でエンコードしてアップしているのでそのようにしてみたのですが、エラーでアップ出来ません。
どうも間違っていそうなのでググってみると、ヘッダにContent-Typeを指定して、画像はバイト配列のまま送信でいいようでした。
以下は、他のWebサーバ上のjpeg画像をダウンロードして、それをライブドアブログにアップロードするコードです。
今日は1日これで悩みましたが、なんとかできてよかったです。Dim wc As New WebClient Dim wc2 As New WebClient Dim stream As Stream Dim sr As StreamReader Dim enc As Encoding = Encoding.UTF8 Dim username As String = "abc" Dim password As String = "1234" Dim upurl As String = "http://livedoor.blogcms.jp/atom/blog/abc/article" Dim nonce As Byte() = makeRandamBytes(40) Dim created As String = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ssZ") Dim bytemain As New List(Of Byte) bytemain.AddRange(wNonce) bytemain.AddRange(System.Text.Encoding.UTF8.GetBytes(created)) bytemain.AddRange(System.Text.Encoding.UTF8.GetBytes(password)) Dim sha1 As New SHA1Managed() Dim passwordDigest As Byte() passwordDigest = wSha1.ComputeHash(bytemain.ToArray()) Dim format As String = "UsernameToken Username=""{0}"", PasswordDigest=""{1}"", Nonce=""{2}"", Created=""{3}""" Dim wsseHeader As String = String.Format(format, username, Convert.ToBase64String(passwordDigest), Convert.ToBase64String(nonce), created) wc.Headers.Add("X-WSSE", wsseHeader) stream = wc.OpenRead("http://livedoor.blogcms.jp/atom/") sr = New StreamReader(stream, enc) literal1.Text = wSr.ReadToEnd() Dim imgBytes As Byte() = wc2.DownloadData("http://example.com/example.jpg") wc.Headers.Add("X-WSSE", wsseHeader) wc.Headers.Add("Content-Type", "image/jpeg") Dim retUp As Byte() = wWc.UploadData(imgurl, "POST", imgBytes) literal1.Text = System.Text.Encoding.UTF8.GetString(retUp)
明日はこれを使って実装です。
がんばります。
[2013-08-05追記]
これでもどうもうまくアップできず、サーバーがエラーを返してくる時があるようです。
ASP.NETのせいなのかどうなのか、、よくわからないのですが。。
以下のコードをページのLoadなどに入れるとうまくいくようでした。
System.Net.ServicePointManager.Expect100Continue = False
なんとなくまだ不安定なのですが、しばらく様子見です。
0 件のコメント:
コメントを投稿