none
HTTPリクエストでテキストファイルが送信できない RRS feed

  • 質問

  •  

    いつもお世話になっております。

     

    HTTPにてPOSTメソッドを使いデータを送信します。

    その際、そのデータに加えてテキストファイルもアップロードします。

     

    DOBONNET様のソースを参考にして、送信はできるようになりましたが、

    サーバーからのレスポンスで「添付ファイルがない」と返ってきてしまいます。

     

    以下にソースを記載します。

    どこが悪いのかがわからず・・・。

     

    ------------------------------------------------------------前略

            'sendlistfile(ここでテキストファイルを選択
            postdata = postdata + "Content-Disposition: form-data; name=""sendlistfile""; filename=""" + fileName + """" + vbCrLf
            postdata = postdata + "Content-Type: application/x-www-form-urlencoded" + vbCrLf + vbCrLf

            'Label3.text = Replace(postdata, vbcrlf, "<br />" & vbcrlf)
            postdata = postdata + "--" + boundary + vbCrLf

            'Label1.Text = postdata

            'バイト型配列に変換
            Dim startData As Byte() = enc.GetBytes(postdata)
            postdata = vbCrLf + "--" + boundary + "--" + vbCrLf
            Dim endData As Byte() = enc.GetBytes(postdata)

            '送信するファイルを開く
            Dim fs As New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read)

            'POST送信するデータの長さを指定
            req.ContentLength = startData.Length + endData.Length + fs.Length

            'データをPOST送信するためのStreamを取得
            Dim reqStream As System.IO.Stream = req.GetRequestStream()

            '送信するデータを書き込む
            reqStream.Write(startData, 0, startData.Length)

            Response.Write(fs)
            'ファイルの内容を送信
            Dim readData(&H1000) As Byte
            Dim readSize As Integer = 0

            While True
                readSize = fs.Read(readData, 0, readData.Length)
                Response.Write(readData)
                If readSize = 0 Then
                    Exit While
                End If
                reqStream.Write(readData, 0, readSize)
            End While


            fs.Close()
            reqStream.Write(endData, 0, endData.Length)

            Response.Write(endData)

            reqStream.Close()

    -----------------------------------------------------------------後略

     

    となります。

    どこが悪いのかご教唆ねがいます。

    よろしくお願いします。

     

    2008年10月22日 9:14

回答

  • 外池と申します。

     

    すいません、お示し頂いたコードで、前提条件がよくわからないところがあります。

    reqと、Responseですが、どのように宣言されたオブジェクトでしょうか?

    (これがわからないと、呼び出しているメソッドが、どのクラスのメソッドを呼び出しているのか判断できません。)

     

    2008年10月23日 8:04
  • 外池です。

     

    コードをずらずらっとお示し頂きましたが、

    reqの宣言は了解です。HttpWebRequestですね。

    あと、Responseはシラっと消されているので、忘れていいわけですね。

     

    んで、ざっとコードを拝見したところ、HttpWebRequestの使い方としては正しくできていると思いますが、しかし、reqから取得したstreamに書き込んでいる内容、つまり、startData、ファイルの中身、endDataの三つの部分が、サーバーが必要としているデータのフォーマットと合致しているのかどうかは、なんともコメントしかねます。

     

    application/x-www-form-urlencodedで、本当にいいんでしょうか?

     

    2008年10月24日 0:57
  • 以下のサイトの「"multipart/form-data" でデータを送信する」の「HttpWebRequest と
    HttpWebResponse を使った方法」のサンプルプログラムをコピペして、それに手を加え
    たのですよね?

     

    POSTでデータを送信する
    http://dobon.net/vb/dotnet/internet/webrequestpost.html

     

    上記のサンプルプログラムは、コンソールアプリのテンプレートの Main にコピペして、
    filePath と url を実際の環境に合わせて書き換えれば、問題なく動くはずですが、それ
    は確認されたでしょうか?

     

    サーバー側も若干疑わしいですが、オリジナルのコードでアップロードできるのであれば、
    サーバー側は問題なさそうで、オリジナルのコードに SqlDataSource1 など正体不明のも
    のを加えたり、boundary の定義、初期化がないとか、"--" + boundary + vbCrLf が2つ
    あるなど、オリジナルのコードから変えている部分に問題があるような気がします。

     

    オリジナルのコードを拡張するなら、一気にやらないで、少しずつ確認しながら行うことを

    お勧めします。

    2008年10月24日 15:44

すべての返信

  • 外池と申します。

     

    すいません、お示し頂いたコードで、前提条件がよくわからないところがあります。

    reqと、Responseですが、どのように宣言されたオブジェクトでしょうか?

    (これがわからないと、呼び出しているメソッドが、どのクラスのメソッドを呼び出しているのか判断できません。)

     

    2008年10月23日 8:04
  • お返事ありがとうございます。

     

    以下全ソースとなります。

    途中のpostdata作成部分は割愛いたします。

     

    どうぞよろしくお願いします。

     

    ----------------------------------------------------以下ソース

    Imports System
    Imports System.Data
    Imports System.IO
    Imports System.Net
    Imports System.Web
    Imports System.Text
    Imports System.Collections

        Protected Sub i__out(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("shift_jis")
            Dim filepath As String = "*****.csv" 
            Dim fileName As String = System.IO.Path.GetFileName(filepath)
            Dim url As String = "****"
            Dim param As String = ""

            'WebRequestの作成
            Dim req As System.Net.HttpWebRequest = CType(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest)

            'メソッドにPOSTを指定
            req.Method = "POST"

            'ContentTypeを設定

            req.ContentType = "multipart/form-data; boundary=" + boundary
            req.ProtocolVersion = System.Net.HttpVersion.Version11
            req.Credentials = New System.Net.NetworkCredential("aaaaa", "bbbbb")

            'データ読み出し
            Dim ds As DataView
            ds = SqlDataSource1.Select(DataSourceSelectArguments.Empty)

            Dim setdatetime As String
            setdatetime = Format(Now, "yyyyMMddHHmm")

            'ポスト・データの作成
            Dim postdata As String = ""
            postdata = "--" + boundary + vbCrLf

    省略

     

           postdata = postdata + "--" + boundary + vbCrLf
            'sendlistfile
            postdata = postdata + "Content-Disposition: form-data; name=""sendlistfile""; filename=""" + fileName + """" + vbCrLf
            postdata = postdata + "Content-Type: application/x-www-form-urlencoded" + vbCrLf + vbCrLf

            postdata = postdata + "--" + boundary + vbCrLf

     

            'バイト型配列に変換
            Dim startData As Byte() = enc.GetBytes(postdata)
            postdata = vbCrLf + "--" + boundary + "--" + vbCrLf
            Dim endData As Byte() = enc.GetBytes(postdata)

     

            '送信するファイルを開く
            Dim fs As New System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read)

     

            'POST送信するデータの長さを指定
            req.ContentLength = startData.Length + endData.Length + fs.Length

     

            'データをPOST送信するためのStreamを取得
            Dim reqStream As System.IO.Stream = req.GetRequestStream()

     

            '送信するデータを書き込む
            reqStream.Write(startData, 0, startData.Length)

     

            'ファイルの内容を送信
            Dim readData(&H1000) As Byte
            Dim readSize As Integer = 0

            While True
                readSize = fs.Read(readData, 0, readData.Length)
                If readSize = 0 Then
                    Exit While
                End If
                reqStream.Write(readData, 0, readSize)
            End While


            fs.Close()
            reqStream.Write(endData, 0, endData.Length)

            reqStream.Close()

     

    2008年10月23日 9:05
  • 外池です。

     

    コードをずらずらっとお示し頂きましたが、

    reqの宣言は了解です。HttpWebRequestですね。

    あと、Responseはシラっと消されているので、忘れていいわけですね。

     

    んで、ざっとコードを拝見したところ、HttpWebRequestの使い方としては正しくできていると思いますが、しかし、reqから取得したstreamに書き込んでいる内容、つまり、startData、ファイルの中身、endDataの三つの部分が、サーバーが必要としているデータのフォーマットと合致しているのかどうかは、なんともコメントしかねます。

     

    application/x-www-form-urlencodedで、本当にいいんでしょうか?

     

    2008年10月24日 0:57
  • 以下のサイトの「"multipart/form-data" でデータを送信する」の「HttpWebRequest と
    HttpWebResponse を使った方法」のサンプルプログラムをコピペして、それに手を加え
    たのですよね?

     

    POSTでデータを送信する
    http://dobon.net/vb/dotnet/internet/webrequestpost.html

     

    上記のサンプルプログラムは、コンソールアプリのテンプレートの Main にコピペして、
    filePath と url を実際の環境に合わせて書き換えれば、問題なく動くはずですが、それ
    は確認されたでしょうか?

     

    サーバー側も若干疑わしいですが、オリジナルのコードでアップロードできるのであれば、
    サーバー側は問題なさそうで、オリジナルのコードに SqlDataSource1 など正体不明のも
    のを加えたり、boundary の定義、初期化がないとか、"--" + boundary + vbCrLf が2つ
    あるなど、オリジナルのコードから変えている部分に問題があるような気がします。

     

    オリジナルのコードを拡張するなら、一気にやらないで、少しずつ確認しながら行うことを

    お勧めします。

    2008年10月24日 15:44
  • こんにちは。中川俊輔 です。

     

    外池さん、SurferOnWwwさん、回答ありがとうございます。

     

    さとちゃん222さん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?有用な情報と思われたため、

    外池さん、SurferOnWwwさんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、ぜひ投稿してみてください!

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

    2008年11月6日 1:23