バイナリデータをエンコードするには?

解決


すぎすぎ@  2005-03-02 19:38:00  No: 88647

現在、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側で送れるようにする為にはどのようにエンコードを行えばよいのか
が分かりません。

以上、何卒ご教授のほどよろしくお願い致します。


魔界の仮面弁士  2005-03-02 20:35:19  No: 88648

>    LineBuffer = StrConv(File.Read, vbFromUnicode)
この時点で化けますよね。(^_^;)

StrConv の vbFromUnicode は、Unicode 形式のバイナリを、
Shift_JIS 形式のバイナリに変換するために使われます。

今回の LZH なバイナリは、Unicodeの文字列データではありませんから、
StrConv を書けるとデータが破壊されていまいます。

バイナリをそのまま送信するようにしてみてください。
(sendメソッドに、Byte配列を格納したVariant型を指定する)


すぎすぎ@  2005-03-02 23:19:45  No: 88649

魔界の仮面弁士様
早速のご回答誠にありがとう御座います。

>今回の 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の最後の情報」を送る方法はあるのでしょうか?
それとも別の方法で送れるのでしょうか?

以上、よろしくお願い致します。


魔界の仮面弁士  2005-03-02 23:49:25  No: 88650

こんな感じで如何でしょう。

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


すぎすぎ@  2005-03-03 02:26:21  No: 88651

魔界の仮面弁士様

教えていただいたソースを参照にプログラムを作成した所、
無事圧縮データをアップロードできました!

魔界の仮面弁士様、
分かりやすいご説明  &  ソース
誠に有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加