現在、HTTP通信で圧縮画像をアップロードする為、
プログラムを作成しているのですがうまくいきません。
開発環境は、
クライアント VB6.0 サーバ WebSphere Studio Application Developer5.0です。
開発方法と致しましては、
Set HttpRequest = CreateObject("MSXML2.XMLHTTP.4.0")
HttpRequest.open "POST", "http://〜/fileupload/upload.do", False
HttpRequest.setRequestHeader "Content-Type", "multipart/form-data; boundary=---------------------------7d510a25c203b6"
HttpRequest.send CVar(LineBuffer)
の手順でアップロードを行おうとしております。
InetSpyを使用し、ブラウザでの通信内容を見ましたので、
ヘッダー情報には食い違いがないように設定できたとは思うのですが、
ただ、バイナリデータの画像にかなりの食い違いが生じていました。
InetSpyで取得したデータの一部を記述致しますと、下記の様になっております。
サーバのデータ
X-lh0-ヲBヲBィ・ test.bmpBMヲBヲ(@・・JRkJZsBJZBJcJRcBRkJJcJRsRZ{RZsZk・JZ{Rc・BRcRc{JJZZc・JZkJc{RRkBBRBJRRRsZc・Jc・9BR))9BZs!)1BRsZk・Rk・9JZ!)9BBZRk・)1BBJkRZk)19ZZ{JJkBZk))1RRcZc{19J9BZRc・ZZsRZ・9BJJcs9Jc99J11BJJRRJcBBJRcsBRZ9JRJZ・JBR!!)9RcJRZ19R1BR9Rk19BJk・!!1BZ{ck・Jk・JR{99BZk・Zs・Zs・)9BRJZZZ・99RRk・Zcscc{cc・ZRkRR{!19Bc{11JRs・Rs・)1JZZkRJk1199ZsZRcBc・cs・1BJ!))Jc・ZRsJBZcZs)9Jck・1119Rsk{・B9Jcs・c{・ks・1BZRk{9JkZs・Zk{ck・BJJcs・Z{・R{・Bk・kk・Rs・BBcBcs!1BcZ{1JcBZckZsRBZZJcJs・BZ・Z{・cRs)!1RRZ91B))BRZ・9BcR{・c├9Z{BJscZ・
作成したデータ
禺ソ・ゆц帥シ[ソ・先I堺持禺帥漆
また、現在のバイナリデータ取得方法について記述致します。
Dim File As ADODB.Stream
Set File = New ADODB.Stream
File.open
File.Type = adTypeBinary
File.LoadFromFile "C:\test.lzh"
Dim LineBuffer
LineBuffer = ""
LineBuffer = StrConv(File.Read, vbFromUnicode)
ですので、バイナリデータのエンコード方法を変えたいのですが、その為に
(1)サーバの文字コードは何なのか
(2)サーバの文字コードをVB側で送れるようにする為にはどのようにエンコードを行えばよいのか
が分かりません。
以上、何卒ご教授のほどよろしくお願い致します。
> LineBuffer = StrConv(File.Read, vbFromUnicode)
この時点で化けますよね。(^_^;)
StrConv の vbFromUnicode は、Unicode 形式のバイナリを、
Shift_JIS 形式のバイナリに変換するために使われます。
今回の LZH なバイナリは、Unicodeの文字列データではありませんから、
StrConv を書けるとデータが破壊されていまいます。
バイナリをそのまま送信するようにしてみてください。
(sendメソッドに、Byte配列を格納したVariant型を指定する)
魔界の仮面弁士様
早速のご回答誠にありがとう御座います。
>今回の LZH なバイナリは、Unicodeの文字列データではありませんから、
>StrConv を書けるとデータが破壊されていまいます。
>
>バイナリをそのまま送信するようにしてみてください。
そうだったのですね。
他の方のソースを見よう見まねで作ったので、分かりませんでした。(>_<)>
ただ、InetSpyで確認を行うと、ファイルの情報は正しく送られているのですが、
sendの最初の情報とsendの最後の情報は、stringのデータを格納したVariant型変数の為、
バイナリ画像(Byte配列)とは繋げません。
その為、それらの情報が送れなくなってしまいました。
以下に作成しているソースを記述致します。
Dim varSendStert
Dim varSendEnd
'sendの最初の情報
varSendStert = "--" & "---------------------------7d510a25c203b6" & vbCrLf
varSendStert = varSendStert & "Content-Disposition: form-data; name=""file"";"
varSendStert = varSendStert & " filename=""C:\test.lzh""" & vbCrLf
varSendStert = varSendStert & "Content-Type: " & "application/octet-stream""" & vbCrLf & vbCrLf
'sendの最後の情報
varSendEnd = vbCrLf & "--" & "---------------------------7d510a25c203b6" & vbCrLf
varSendEnd = varSendEnd & "Content-Disposition: form-data; name=""submit""" & vbCrLf & vbCrLf
varSendEnd = varSendEnd & "アップロード" & vbCrLf
varSendEnd = varSendEnd & "--" & "---------------------------7d510a25c203b6" & "--"
'sendの最初の情報 + バイナリデータ +sendの最後の情報
LineBuffer = varSendStert & LineBuffer & varSendEnd
↑ここで、型変換できずに処理がエラーとなります。
sendに「sendの最初の情報 + バイナリデータ(Byte配列) +sendの最後の情報」を送る方法はあるのでしょうか?
それとも別の方法で送れるのでしょうか?
以上、よろしくお願い致します。
こんな感じで如何でしょう。
Dim F As ADODB.Stream
Dim S As ADODB.Stream
Dim P As Long
Dim V As Variant
'バイナリのロード
Set F = New ADODB.Stream
F.Type = adTypeBinary
F.Open
F.LoadFromFile "C:\test.lzh"
F.Position = 0
'送信データの受け皿を作成
Set S = New ADODB.Stream
S.Type = adTypeText
S.Charset = "ASCII"
S.LineSeparator = adCRLF
S.Open
'前半のテキスト部を出力
S.WriteText "-----------------------------7d510a25c203b6", adWriteLine
S.WriteText "Content-Disposition: form-data; name=""file.lzh"";", adWriteLine
(中略)
'中間のバイナリ部
P = S.Position
S.Position = 0
S.Type = adTypeBinary
S.Position = P
S.Write F.Read(adReadAll)
F.Close
'後半のテキスト部
P = S.Position
S.Position = 0
S.Type = adTypeText
S.Position = P
S.WriteText "-----------------------------7d510a25c203b6", adWriteLine
(中略)
'Byte配列として受け取る
S.Position = 0
S.Type = adTypeBinary
V = S.Read(adReadAll)
S.Close
魔界の仮面弁士様
教えていただいたソースを参照にプログラムを作成した所、
無事圧縮データをアップロードできました!
魔界の仮面弁士様、
分かりやすいご説明 & ソース
誠に有難う御座いました。
ツイート | ![]() |