tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル.netでのストリームの扱い
記事No11482
投稿日: 2015/08/31(Mon) 17:31
投稿者でふぁいあんと
お世話になります
vb6 No.16149では大変お世話になりました。

いろいろ調べながらvb.netへの移行を進めていますが
streamの扱いがどうしてもわからないので質問させていただきます

webに送信するmultipart/form-dataがあり中身はテキストと
バイナリ(例えば画像データ)が混在します

移行中なので、vb6のオブジェクトを使い
dim adoST as new adodb.stream
dim strPOST as string '->post送信のテキスト部分
dim bytIMAGE as byte '->filestreamで読み込み済み画像ファイルデータ
dim bytPOST as byte '->送信用バイト文字列

'最初のpost項目をストリームへ
adoST.Type = ADODB.StreamTypeEnum.adTypeText
adoST.Open()
adoST.Charset = "SJIS"
adoST.WriteText(strPOST)

'画像ををストリームへ
lngPosition = adoST.Position
adoST.Position = 0
adoST.Type = ADODB.StreamTypeEnum.adTypeBinary
adoST.Position = lngPosition
adoST.Write(bytImage)
'''その他は略
adoST.Position = 0
adoST.Type = ADODB.StreamTypeEnum.adTypeBinary
bytPOST = adoST.Read
adoST.Close()

これで、WebRequestにbytPOSTを送信させるとうまくいきます。

これをvb.net標準のコードにするのはどうすればよいのでしょうか
ファイルは関係しないので、streamreader当たりは違うのかと
思っています
単純に バイト文字列の結合ができればよいのですが
基本過ぎて?検索しても出てきませんでした

よろしくお願いします

[ツリー表示へ]
タイトルRe: .netでのストリームの扱い
記事No11483
投稿日: 2015/09/01(Tue) 01:43
投稿者魔界の仮面弁士
> vb6 No.16149では大変お世話になりました。
追加の質問があることに備えて、念のため、先の Microsoft への問い合わせは
終了させずに、サポート側の担当者に待機してもらっています。
(特に大きな問題が無さそうなら、あちらへの問い合わせはクローズさせます)


> dim bytIMAGE as byte '->filestreamで読み込み済み画像ファイルデータ
> dim bytPOST as byte '->送信用バイト文字列
…Byte、ですか?
Byte の一次元配列ではなく?

提示頂いたコードは、VB6としてもVB.NETしても不自然なので、
意図が良く分かりませんでした。

Shift_JIS のバイナリが必要なら、System.Text.Encoding.GetEncoding(932) が使えますが、
今回のコードに近い実装を行うなら、ADODB.Stream の代わりに
System.IO.MemoryStream を使ってみては如何でしょう。
それを BinaryReader/BinaryWriter に渡して使えば、読み書きも容易になります。


> これをvb.net標準のコードにするのはどうすればよいのでしょうか
HttpWebRequest の GetRequestStream() で得られるストリームに
書きこめば良いかと思います。
書きこむ際には、上記の BinaryWriter を使うのが便利です。


> 単純に バイト文字列の結合ができればよいのですが
> 基本過ぎて?検索しても出てきませんでした
Stream に順次書きこんでいけば、追記されますよ。

[ツリー表示へ]
タイトルRe^2: .netでのストリームの扱い
記事No11484
投稿日: 2015/09/01(Tue) 12:14
投稿者魔界の仮面弁士
> > これをvb.net標準のコードにするのはどうすればよいのでしょうか
> HttpWebRequest の GetRequestStream() で得られるストリームに
> 書きこめば良いかと思います。

HttpWebRequest を使って、google 画像検索に画像ファイルをマルチパートで POST してみました。
参考になれば。


Imports System.Net
Imports System.IO
Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim pngImageFile As String = "C:\TEMP\img.png"

        'これは google image search API の URL ではなく、
        'ブラウザで「google 画像検索」を呼び出したときの
        'アップロード用の URL です
        Dim url As String = "https://www.google.co.jp/searchbyimage/upload"

        '任意のバウンダリ文字列を用意
        Dim boundary As String = StrDup(5, "-") & Guid.NewGuid().ToString("N")


        'multipart/form-data 形式で POST するための準備
        Dim req = DirectCast(WebRequest.Create(url), HttpWebRequest)
        req.Method = WebRequestMethods.Http.Post
        req.ContentType = "multipart/form-data; boundary=" & boundary
        req.AllowAutoRedirect = True


        'リクエスト内容は、いったん MemoryStream に入れておきます
        ' RequestStream に直接書き込んでも良いのですが、
        '  それだと、書き込んだ内容を後でチェックできないので、
        '  Byte() や MemoryStream を中継させた方がデバッグしやすいです。
        Dim reqData As New MemoryStream()

        Dim encUTF8 = System.Text.Encoding.UTF8
        Dim writer As New BinaryWriter(reqData, encUTF8)

        'ファイルパート
        writer.Write("--" & boundary & vbCrLf)
        writer.Write("Content-Disposition: form-data; name=""encoded_image""; filename=""" & pngImageFile & """" & vbCrLf)
        writer.Write("Content-Type: image/png" & vbCrLf)
        writer.Write(vbCrLf)

        Dim rawBin() As Byte = File.ReadAllBytes(pngImageFile)
        writer.Write(rawBin)
        writer.Write(vbCrLf)

        '表示言語パラメータ
        writer.Write("--" & boundary & vbCrLf)
        writer.Write("Content-Disposition: form-data; name=""hl""" & vbCrLf)
        writer.Write(vbCrLf)
        writer.Write("ja" & vbCrLf)

        'マルチパートの終端
        writer.Write("--" & boundary & "--")

        'MemoryStream の内容をフラッシュ(ADODB.Stream の Flush と同義)
        reqData.Flush()

        'ここからが本番
        Dim reqStream = req.GetRequestStream()

        'POST する要求ボディを書き込む
        reqData.Position = 0
        reqData.CopyTo(reqStream)
        reqStream.Flush()

        reqData.Dispose()   '書き込みは完了したので、MemoryStream はもう要らない
        reqStream.Close()   '要求ボディの書き込み終了。でも送信前なので Dispose しちゃ駄目。

        'いざ送信!
        Dim res = DirectCast(req.GetResponse(), HttpWebResponse)

        'サーバーから結果を受け取る
        Dim resStream = res.GetResponseStream()

        '応答ボディを、いったん MemoryStream に入れなおす
        Dim resData As New MemoryStream()
        resStream.CopyTo(resData)

        '要求ボディも応答ボディも、もう使わないので破棄
        reqStream.Dispose()
        resStream.Dispose()

        'レスポンスの文字コードを自動判定する必要がある場合の処理例
        '  今回の Yahoo API を使う場合には不要な判定処理かと思いますが一応
        Dim resEnc As System.Text.Encoding

        'ヘッダーに、「Content-Type: text/html; charset=Shift_JIS」などの
        '文字列が来ていないかチェックする
        Dim ct As String = res.Headers("Content-Type")
        Dim pos = Strings.InStr(ct, "charset=", CompareMethod.Text)
        If pos > 0 Then
            Dim enc = Strings.Mid(ct, pos + "charset=".Length)
            resEnc = System.Text.Encoding.GetEncoding(enc)
        Else
            'charset が不明な場合は推測するしかない
            '  下記では、とりあえず UTF-8 で代用していますが、時には
            '  Response Body のバイナリ内容から判定する必要があるかも
            resEnc = System.Text.Encoding.UTF8
        End If

        'MemoryStream のままだと Read しにくいので、
        '通常は BinaryReader なり StreamReader なりを併用します
        Dim reader As New StreamReader(resData, resEnc)

        '応答結果すべてを文字列として読み取る場合
        resData.Position = 0
        Dim responseText As String = reader.ReadToEnd()

        'バイナリとして取得
        resData.Position = 0
        Dim responseBinary() As Byte = resData.ToArray()

        resData.Dispose()   '読み込み終わったので、MemoryStream はもう要らない

        TextBox1.Text = responseText
    End Sub
End Class

[ツリー表示へ]
タイトルRe^2: .netでのストリームの扱い
記事No11485
投稿日: 2015/09/01(Tue) 14:34
投稿者でふぁいあんと
魔界の仮面弁士様 いつも大変おせわになっております
>Byte の一次元配列ではなく?
はい。一次元配列です。。すみません
しかし、見事にこちらの意図を組んでいただき
ありがとうございます
コードの分析は後ほどやってみます

取り急ぎ

>追加の質問があることに備えて、念のため、先の Microsoft への問い合わせは
>終了させずに、サポート側の担当者に待機してもらっています。
>(特に大きな問題が無さそうなら、あちらへの問い合わせはクローズさせます)
連絡しなくてすみませんでした
代替手段も見つかったのでクローズして頂いてください。

ジュースの件も本気なのですが
どーやってすれ違おうかと(笑)

[ツリー表示へ]
タイトルRe^3: .netでのストリームの扱い
記事No11486
投稿日: 2015/09/01(Tue) 15:52
投稿者魔界の仮面弁士
> 代替手段も見つかったのでクローズして頂いてください。
了解です。

なお、万一、製品仕様に基づく問題があった場合には、本件を扱ってくださった
Microsoft の担当者(SQL Server サポートチーム)にて再支援いただけるそうなので、
問題点があれば、こちらの VB.NET 掲示板に書き込んでください。

乗りかかった船なので、こちらとしても最後まで完成させて欲しいですし。



> ジュースの件も本気なのですが
> どーやってすれ違おうかと(笑)

今回の件は、ServerXMLHTTP / XMLHTTP では通信できないサーバーがあるということを
知ることができたというだけでも、こちらとしては満足としています。お気になさらず。
興味があるネタだったからこそ、首を突っ込んだわけですし。

ジュースの件はまぁ、縁があったらということで。(^^;

一応、イベント等で名刺交換した初対面の相手が、以前の質問者だったということは
数回あったりします。もちろん、滅多にあることではないですけれどね。

# とりあえず直近だと、今週金曜日のfest2015東京会場に参加してます。
# http://www.microsoft.com/ja-jp/events/fest/2015/

[ツリー表示へ]
タイトルRe^4: .netでのストリームの扱い
記事No11487
投稿日: 2015/09/01(Tue) 17:21
投稿者でふぁいあんと
> 乗りかかった船なので、こちらとしても最後まで完成させて欲しいですし。
なんともはや恐縮しております。

> # とりあえず直近だと、今週金曜日のfest2015東京会場に参加してます。
> # http://www.microsoft.com/ja-jp/events/fest/2015/
かなり敷居高いですね(涙)、何か書籍の出版サイン会とかないですか


で本題です。
この送信ソースは、ぜひマスターするつもりですが、
とりあえず、現在のプログラムで
Dim req As System.Net.WebRequest = _
            System.Net.WebRequest.Create("http://hogehoge.com/send")      
Dim reqStream As System.IO.Stream = req.GetRequestStream()
'送信データ
bytPOST = adoStream.Read
'送信するデータを書き込む
reqStream.Write(bytPOST, 0, bytPOST.Length)
という感じで、adoStreamからbyte配列に変換したものは成功しています

それで魔界の仮面弁士様のコードより
Dim reqData As New MemoryStream()
Dim enc = System.Text.Encoding.UTF8
'Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(932)
Dim writer As New BinaryWriter(reqData, enc)
writer.Write("--" & strBoundary & vbCrLf) '---a
writer.Write("Content-Disposition: form-data; name=""file""; filename=""" & strImageFile & """" & vbCrLf) '---b
writer.Write("Content-Type: image/jpeg" & vbCrLf & vbCrLf)
writer.Write(bytImage)
writer.Write(vbCrLf)
writer.Write("--" & strBoundary & "--" & vbCrLf)
bytPOSTn = reqData.ToArray
        
としたのですが、
これを
reqStream.Write(bytPOSTn, 0, bytPOSTn.Length)
とするとうまくいきません。
fiddlerで文字列を確認するとaの行頭で"(" = &h28
bの行頭で"o"=&h6f という 化け文字が入っているようです。
UTF-8からSJISにしても同じです。


ご提案いだたけたソースも別関数として
用意しておこうかと思っていますが
配列は基本的なところなので
この機会にぜひご指導いただけたらと思います

[ツリー表示へ]
タイトルRe^5: .netでのストリームの扱い
記事No11489
投稿日: 2015/09/01(Tue) 18:47
投稿者魔界の仮面弁士
> fiddlerで文字列を確認するとaの行頭で"(" = &h28

これは私のコードのミスですね。申し訳ない。
BinaryWriter.Write(string) の場合、先頭に文字長プリフィックスが入ってしまいます。
https://msdn.microsoft.com/ja-jp/library/yzxa6408.aspx

BinaryWriter の代わりに、StreamWriter を使ってみてください。


Imports System
Imports System.IO
Imports System.Text
Module Module1
    Sub Main()
        Using ms As New MemoryStream()

            Dim enc As Encoding
            'enc = Encoding.UTF8
            enc = New UTF8Encoding(False)

            Dim txtWriter As New StreamWriter(ms, enc)
            txtWriter.Write("ABCDEFG")
            txtWriter.Flush()

            ms.Position = 0
            Dim bin() As Byte = ms.ToArray()

            '「41-42-43-44-45-46-47」になるはず
            Console.Clear()
            Console.WriteLine(BitConverter.ToString(bin))
        End Using
        Console.ReadKey()
    End Sub
End Module

[ツリー表示へ]
タイトルRe^6: .netでのストリームの扱い
記事No11490
投稿日: 2015/09/02(Wed) 15:41
投稿者でふぁいあんと
大変申し訳ないです。
いろいろ調べてはいるのですが、、、

頂いたコードに

>             Dim txtWriter As New StreamWriter(ms, enc)
>             txtWriter.Write([画像直前までのpostテキスト])
              Dim rawBin() As Byte = File.ReadAllBytes(pngImageFile)
              writer.Write(rawBin)
              writer.Write(vbCrLf)
              writer.Write([マルチパートの終端])
>             txtWriter.Flush()
>             ms.Position = 0
>             Dim bin() As Byte = ms.ToArray()
として、  reqStream.Write(bin, 0, bin.Length)に送ったのですが
[画像直前までのテキスト]は正常に送られていますが、
bin の部分が、fiddlerの表示で system.byte[]となっていて
画像の内容が入っていないようです。

[ツリー表示へ]
タイトルRe^7: .netでのストリームの扱い
記事No11491
投稿日: 2015/09/02(Wed) 16:22
投稿者魔界の仮面弁士
> bin の部分が、fiddlerの表示で system.byte[]となっていて
> 画像の内容が入っていないようです。

> writer.Write(rawBin)

Stream クラスの Write メソッドには、
 Sub Writer( value() As Byte )
に相当するオーバーロードがありません。上記のコードからは、
 Sub Writer( value As Object )
のオーバーロードの呼び出しとして扱われます。

https://msdn.microsoft.com/ja-jp/library/dfc2b8zk.aspx
》 オブジェクトで ToString メソッドを呼び出して、
》 そのオブジェクトのテキスト形式をテキスト文字列またはストリームに書き込みます。


今回の場合は、Stream 系クラスすべてが持つ
 Sub Write( buffer() As Byte, offset As Integer, count As Integer )
のメソッドを使って、
 .Write(raw, 0, raw.Length)
とすると良いでしょう。


もしくは、テキストの書き込みには StreamWriter を使うようにし、
バイナリの書き込みには BinaryWriter を使うという、併用案もあります。

Imports System
Imports System.IO
Imports System.Text
Module Module1
    Sub Main()
        Dim txt As String = "ABCDEF"
        Dim raw() As Byte = {1, 2, 3, 4, 5}

        Dim enc As New UTF8Encoding(False)
        Using ms As New MemoryStream()
            Dim txtWriter As New StreamWriter(ms, enc)
            txtWriter.AutoFlush = True
            Dim binWriter As New BinaryWriter(ms, enc)

            txtWriter.Write(txt)
            binWriter.Write(raw)

            ms.Position = 0
            Dim bin() As Byte = ms.ToArray()

            '「41-42-43-44-45-46-47-01-02-03-04-05」になるはず
            Console.Clear()
            Console.WriteLine(BitConverter.ToString(bin))
        End Using
        Console.ReadKey()
    End Sub
End Module


あるいは StreamWriter や BinaryWriter の類は一切使わずに、すべてを
 Sub Write( buffer() As Byte, offset As Integer, count As Integer )
で済ませるという手もあります。
(文字列を書き込む場合には、Encoding クラスの GetBytes メソッドを使ってバイナリ化する)

[ツリー表示へ]
タイトルRe^8: .netでのストリームの扱い
記事No11492
投稿日: 2015/09/02(Wed) 18:24
投稿者でふぁいあんと
魔界の仮面弁士様 お早い回答ありがとうございます。
ご指示頂いた、StreamWriterとbinaryWriterの併用案で
うまくいくことができました
解決とさせていただきます。

ここからは、もしお時間があればでよいのですが
(1)最初の
今回の場合は、Stream 系クラスすべてが持つ
 Sub Write( buffer() As Byte, offset As Integer, count As Integer )
のメソッドを使って、、、
ですが、
streamwriteにWrite( buffer() As Byte, offset As Integer, count As Integer )を実行したところ
[これらの引数で呼び出される、アクセス可能な 'Write' がないため、オーバーロードの解決に失敗しました]
となりました
writeにすると(bytbuffer() as char,index,,,となっているようですが、、、

(2)また、
あるいは StreamWriter や BinaryWriter の類は一切使わずに、、、

こちらについても、もう少しヒントをいただけないかと、、

(3)これ基本的過ぎて無視されてもよいのですが
.netになってから変数宣言をブロックの頭にしなくてもよくなったのでしょうか
確かに変数宣言と代入を同時にできるので行頭にすることができないのは
わかりますが、変数の利用状況がわからないから行頭に書けと
ずいぶーーん以前から頭に入ってます。。
(こんなこと検索しても出てきません(笑))

(3)はともかく(1),(2)だけでもお願いします

[ツリー表示へ]
タイトルRe^9: .netでのストリームの扱い
記事No11493
投稿日: 2015/09/02(Wed) 21:00
投稿者魔界の仮面弁士
>  Sub Write( buffer() As Byte, offset As Integer, count As Integer )

具体的には、System.IO.Stream クラスが持つ下記のメソッドです。
https://msdn.microsoft.com/ja-jp/library/system.io.stream.write.aspx


Stream は、MemoryStream や FileStream の継承元となる抽象クラスです。
そして Stream から派生された全てのクラスが、上記の Write メソッドを装備しています。
(ちなみに Stream 派生クラスは、殆んどの場合「何某Stream」というクラス名が付けられています)

まぁ、読み取り専用(.CanWrite = False)なストリームだと使えませんけれどね。
そのようなストリームで Write を呼ぶと、実行時に例外が発生するはず。


> streamwriteにWrite( buffer() As Byte, offset As Integer, count As Integer )を実行したところ
> [これらの引数で呼び出される、アクセス可能な 'Write' がないため、オーバーロードの解決に失敗しました]
> となりました
StreamWriter はストリームではありませんよ。何某Stream という名前では無いですよね。
StreamWriter の継承元は System.IO.Stream ではなく、System.IO.TextWriter です。


StreamWriter の Write メソッドにおいて、3 個の引数を受け取るオーバーロードは
 .Write(Char(), Int32, Int32)
 .Write(String, Object, Object)
の 2 つしかありません。そして「Byte(), Int32, Int32」はどちらにも解決できないため、
コンパイルエラーになってしまうというわけです。


Stream.Write( Byte(), Int32, Int32 ) を、No11491 の例で呼び出すとすれば
 ms.Write(raw, 0, raw.Length)
 txtWriter.BaseStream.Write(raw, 0, raw.Length)
 binWriter.BaseStream.Write(raw, 0, raw.Length)
などといったコードを記述できます。
とはいえ今回は、BinaryWriter の Write( Byte() ) を使った方が手っ取り早いでしょうね。


> (2)また、
> あるいは StreamWriter や BinaryWriter の類は一切使わずに、、、
> こちらについても、もう少しヒントをいただけないかと、、

ストリーム(Stream継承クラス)への書き込みに、
ライター(BinaryWriter、StreamWriter 等)を使わないということです。


ファイルの内容をバイナリとして取得したいなら、
 raw = File.ReadAllBytes(ファイルパス)
文字列を Shift_JIS バイナリとして取得したいなら、
 raw = Encoding.GetEncoding("Shift_JIS").GetBytes(文字列)
として取得できますので、あとは Byte配列である 上記の raw を
今回の ms As StreamWriter に対して
 ms.Write(raw, 0, raw.Length)
の構文で書き込むということです。


> .netになってから変数宣言をブロックの頭にしなくてもよくなったのでしょうか
もっと前からです。VB6 においても、下記のコードは動作しますよ。

Option Explicit

Private Sub Form_Load()
    Dim a As Integer
    a = 123
    
    's = "Before"  'これは NG
    
    Dim s As String
    s = "After" 'これは OK
End Sub


ちなみに VBScript に至っては下記さえも OK ですが…これは特殊な例ですね。

Option Explicit
Dim a
a = 123
s = "TEST"
Dim s
MsgBox s




> わかりますが、変数の利用状況がわからないから行頭に書けと
> ずいぶーーん以前から頭に入ってます。。
旧 BASIC 言語や VB2 の頃は、そう言われていましたね。
現在の私は、「使う直前に宣言 & 初期化」派ですけれども。


初期化が容易になったというのも、変化が訪れた理由の一つですが、
他にも理由については諸説あります。たとえば:

・ANSI C (≠C++)では、ローカル変数の宣言を関数などのブロックの先頭で宣言しなければいけなかった。
 当時は他にも、先頭に用意された「変数宣言のためのセクション」の中でしか変数を確保できない言語が
 多かったため、それらとの移植性を容易にするという事情があった。

・メモリ等が今ほど潤沢でなかった当時は、無駄な未使用変数を確保すべきではなかったため、
 管理しやすいよう、冒頭に記述することが推奨されていた。

などが思い当たります。


ところが冒頭で宣言する方法の場合、コードが長くなってくるにつれて、
「変数を利用している箇所」と「変数の宣言箇所」とが遠く離れてしまうため、
変数の数やコード量が増加するに伴って可読性が低下してしまいます。
(長すぎるコードというのは、それはそれで別の問題があるわけですが)

それに最近のコンパイラなら、未使用変数は自動的に検出してくれますので、
冒頭に書かなければならない理由は薄れてしまいました。このような理由から
特に VB.NET においては、使う直前で宣言する手法も増加してきています。


ただ、冒頭に宣言する手法が必ずしも悪いという訳ではありませんし、このあたりは好き嫌いの問題でもあります。
そもそも VB6 の場合は未使用変数のチェック機構などがありませんしね。


なお、ローカル変数の扱いについては、VB.NET になってからも微妙に変化しています。

2002 の頃は
 Dim i As Integer
 For i = 1 To 10
  Console.WriteLine(i)
 Next
と書かねばならなかったコードが、2003 からは
 For i As Integer = 1 To 10
  Console.WriteLine(i)
 Next
と書けるようになりました。

前者だと、For ループを抜けた後も変数 i を利用できてしまいますが、
後者なら、その For 内でしか i を使えないため、変数のスコープを
より狭くすることができます。

さらに 2008 になってからは、「型推論」のおかげで、As Integer すら省略して、
For i = 1 To 10 と書けるようにもなっていますね。


そのほかの VB6 との違いとしては、こんなのもあります。
 Dim i As Integer
 For i = 1 To 10
  Dim x As Integer
  x = x + i
 Next
 Call MsgBox(x)

変数 x は For ブロック内で宣言されているため、
VB.NET の場合、このブロックの外ではアクセスできません。
しかし VB6 はブロックレベル変数を考慮しないため、
上記のコードでも動作するという違いがあります。


とはいえ従来の VB においても、「カプセル化」を意識した開発者であれば、
 「グローバル変数は無闇やたらと使わない」
 「Public なプロシージャは避け、極力、Private を使う」
といった考え方を持っていました。ブロック変数が使えないという言語上の制約はあれども、
変数のスコープを狭く抑えるべきだという流れは、今も昔も同じかと思います。
(宣言箇所をできるだけ「使う直前」に行うのも、スコープを狭める一助となります)


その一方で、たとえ利用箇所が後の方であっても、あえて先頭に書いた方が分かりやすいこともあります。
具体例を挙げるのは難しいのですが、たとえば
メソッド内で重要な意味を持つ変数(戻り値を保持する変数など)や、
メソッド内での使用頻度が非常に高い変数などの場合などですかね。

また、関連性のある変数群は、それらを一箇所にまとめておいた方が
わかりやすいという考え方もあるでしょう。それが先頭部であろうとなかろうと。


――ですから、何が何でも「利用する直前」に宣言するべきだと、というわけでもありません。加減は必要ですね。


> (こんなこと検索しても出てきません(笑))
VB4 の Books Online に記載されていたような記憶もありますが、超うろ覚えです。
当時は Form1!Text1 派と Form1.Text1 派がいたりもしたっけか…。

[ツリー表示へ]
タイトルRe^10: .netでのストリームの扱い
記事No11494
投稿日: 2015/09/03(Thu) 17:28
投稿者でふぁいあんと
魔界の仮面弁士様 ほんとうにありがとうございました。
変数宣言にまでおつきあいいただき
誠に感謝感謝です。

非常に分かりやすい文章で、うろこがおちております
このスレッド、スマホにメモして
しばらく読み続けようかと思います

>旧BASIC 言語や VB2 の頃は、そう言われていましたね。
汗;;;;

まだまだお聞きしたいことがあるのですが
あまり甘えてもいけないと思いますので
一旦締めさせていただきます。
また何かありましたらよろしくお願いします

[ツリー表示へ]
タイトルRe^4: .netでのストリームの扱い
記事No11488
投稿日: 2015/09/01(Tue) 17:51
投稿者でふぁいあんと
一応、ご提案頂いたソースをコピーして
使ってみたのですが、やはり同じような化け方をしました

一部ですが
Dim strBoundary As String = StrDup(5, "-") & Guid.NewGuid().ToString("N")
Dim enc = System.Text.Encoding.UTF8
'Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(932) 'SJIS
'Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(51932) 'EUC
---略
Dim writer As New BinaryWriter(reqData, enc)
writer.Write("--" & strBoundary & vbCrLf) '---a
writer.Write("Content-Disposition: form-data; name=""file""; filename=""" & strImageFile & """" & vbCrLf) '---b
--略
Dim res = DirectCast(req.GetResponse(), HttpWebResponse)

fiddlerでみたところ、aのところで行頭に"("
bのところで行頭に"o"がまざります(sjisでもeucでも同じです)

[ツリー表示へ]