質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2653閲覧

VB.net POST通信で指定URL(phpファイル)にCSVファイルを送りたいです。

bonabona

総合スコア6

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

1グッド

1クリップ

投稿2020/02/18 07:31

VB.netの逆引き大全を見て、WEBサーバーへCSVファイルのアップロードを試みているのですが、教本の真似をしてもうまくいきません。アップロードはされるのですが、サーバーでCSVファイルを確認すると中身がなく、容量は当然0KBとなっています。当方、サーバーのphpファイルに渡したCSVファイルの1行ずつをMySQLへデータを追加する作業を行っています。
CSVファイルは50行2列(質問・回答)のデータ群です。
|質問|回答|
|aaa|aaa| <---CSVファイルの中身は見出しなし、ここから50行分
|bbb|bbb|
|bbb|ccc|

また、CSVファイルはSJISで、phpファイルの中でUTF8に変換されデータベースへ登録される仕組みです。
以下、VB側で設定するコードです。

vb

1Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 2 Dim client As New HttpClient() 3 Try 4 Dim content As New MultipartFormDataContent() 5 Dim path = "C:デスクトップ\data.csv" 6 Dim fileCont = New StreamContent(System.IO.File.OpenRead(path)) 7 fileCont.Headers.ContentDisposition = 8 New ContentDispositionHeaderValue("attachment") With 9 { 10 .FileName = System.IO.Path.GetDirectoryName(path) 11 } 12 content.Add(fileCont) 13 Await client.PostAsync("http://送信先ファイル.php", content) 14 TextBox2.Text = "OK" 15 16 Catch ex As Exception 17 TextBox2.Text = "NG" 18 End Try 19 20 21 End Sub

なお、fileCont.Headers.ContentDisposition からcontent.Add(fileCont)の手前までをコメントアウトし、
ダミーデータとして1200行分のCSVファイルをテストしたところ、同じくサーバには送られ内容も25KBと存在しておりました。
しかし、先頭から200行分データが抜け落ち、POST通信上付加される情報が最終データ行から1行飛ばして記録されていました。
なお本番で扱う50行分のCSVファイルでは上記のコメントアウトをしてもしなくても0KBとなっています。
自分の見解としてはヘッダー情報のコーディングが問題なのかと思っていますが、私の勉強不足もありこれをクリアしきれませんでした。ほかにも色んなサイトを探すのですが、基本的には同じコードでして、ここから必要なコーディングをどなたか御教示願えないでしょうか。
何卒よろしくお願い申し上げます。

dotnetuseryamag👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

失礼ながらやってることがメチャクチャという感じがしてます。

Fiddler などのキャプチャツールを使って要求・応答を調べてください。

送信ヘッダに指定されている boundary で各パートが分けられ、各パートに Content-Disposition などのヘッダ情報が付与されてないと Web サーバー側で処理できないと思いますよ。以下のような感じです。

イメージ説明

上の画像の要求を送信した HttpClient を使った Windows Forms アプリの例は以下の記事にありますので見てください(コードは C# ですが)。

HttpClient でファイルアップロード
http://surferonwww.info/BlogEngine/post/2019/08/11/file-upload-by-using-httpclient.aspx

投稿2020/02/18 09:29

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bonabona

2020/02/18 09:46

ご返信ありがとうございます。 なにぶん教科書をそのままコピペでできると思っていたので、メチャクチャであるとのご指摘はごもっともだと思います。。。 頂いた記事をもとに勉強しようと思います!ありがとうございます! 解決後改めてご報告いたします。
退会済みユーザー

退会済みユーザー

2020/02/18 23:54 編集

一気に全部解決しようとしないで、(1) クライアント側から上の私の回答の Fiddler 画像のようにちゃんと送信できているか、(2) サーバ側で送信されてきたデータを受けて期待どおりが処理ができているか・・・に分けて、まず (1) を解決するようにしましょう。 (1) については私の回答で紹介した記事にサンプルがあるのでそれを参考にしてください。記事では送信しているのは .jpg 画像ですが、.csv でも記事のサンプルコードはファイル名と Content-Type 以外は全く同じにできるはずです。
guest

0

自己解決

SurferOnWww様
たくさんのアドバイスまことにありがとうございます。
それをもとにワイヤーシャーク等取得して試みたのですが、やはり実力不足で実現できませんでした。参考のコードを真似はしてみたものの、細かいところのコーディングが理解できず、できませんでした。

そこで、別の方法を考えました。VB側はWebClientを利用し、またファイルを受け取るPHP側のコードも見直し、自己解決いたしましたのでご報告いたします。

VB

1 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 2 3 Dim client As New WebClient() 4 Dim path = Directory.GetCurrentDirectory() 5 Try 6 '指定URLへファイルをアップロードする 7 Dim data() As Byte = 8 client.UploadFile("PHPファイルのURL", path & "\data.csv") 9 10 Label14.Text = "接続完了。Webサーバーに結果を送りました。" 11 12 Catch ex As Exception 13 Label14.Text = "接続エラー。ネットワークに接続してください。" 14 End Try 15 End Sub

PHP

1//ファイル受け取りコード 2$data = file_get_contents($_FILES['file']['tmp_name']);

上記の組み合わせでやりたいことは実現できました。
今回は開発優先という中で自己解決方法を見つけましたが、お陰様で実際のPOST通信で行われているヘッダー情報等の理解について、今後しっかりと勉強しなければいけないと痛感しています。
今後とも利用させていただきたいと思います。ありがとうございました。

投稿2020/02/21 03:30

bonabona

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/02/21 04:13

今回の問題とは関係ない余計なお世話かもしれませんが、Exception をキャッチするのは止めた方がいいです。最終的には上の回答のコードのままにするわけではないのかもしれませんが、もし今のコードのままですと例外は握りつぶされて無かったことになってしまいます。基本的に例外が発生した場合は、ユーザーがそのまま作業を続けて事態を悪化させないためにも、例外をランタイムに拾わせてアプリケーションを停止させるべきです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問