DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VBでのファイル送受信について

環境/言語:[OS : Windows XP / 言語 : Visual Basic .NET / .NET Framework : 1.1]
分類:[.NET]

お世話になります。

【解決したい問題】

VB.NET2003で開発されたWindowsアプリを、前任者より引継ぎ、
現在、ファイルの送受信についての機能改善を検討しています。

送信の方を例にしますと、現行は
Windowsアプリ側で送信ファイル(テキスト出力して圧縮(lzh)したファイル)を作成したのち
Process.Start(https://www.xxxxx.co.jp/cgi-bin/・・・)で専用のページを表示してブラウザ上で
送信しています。(参照ボタンでWindowsアプリで作成された送信ファイルを指定し、送信ボタン
でファイルが送信されるといった感じです)

これと同じことを、Windowsアプリ側でVBのプログラムで直接行えないか?と考えています。
# 直接Windowsアプリから送受信できないの?といった以前からの要望もあったようで
# 改善する運びとなりました。現行の仕様のいきさつは不明ですが…

まわりくどくなってしまいましたが、まとめますと…
・特定のアドレスにファイルをアップロードするには?
・特定のアドレスからファイルをダウンロードするには?
以上を、VBのプログラムから行いたいのですが。

【解決するために何をしたか】

引継ぎの際に、FTPについて調べれば?という助言(キーワード)だけはもらっていたので
WEB検索をしていたところ、こちらの.NET Tipsにて以下を見つけることができました。
「FTPサーバーにファイルをアップロードする」
「FTPサーバーからファイルをダウンロードする」
# .NET Framework 2.0以降でのみ使用できるとの事ですが、いい機会なので現状の
# プロジェクトをVB2005以上に移行させるのも有りかなと思い・・・

早速テスト用のプロジェクトを用意して、無事動作するところまで辿り着きましたが
現行は、前述の通りhttpsのページで送信しているので、SSLによる暗号化通信がされて
いるのだと思います。そうなると「同じこと」を行っている事にはならない・・・?

と、現在このあたりで行き詰っています。


そうなりますと、最終的な質問としては
SSLによる暗号化通信で、VBのプログラムから直接
・特定のアドレスにファイルをアップロードするには?
・特定のアドレスからファイルをダウンロードするには?

以上を行う方法について助言頂けないでしょうか?よろしくお願いします。
経緯・現状・質問が入り混じり、乱文・長文となりましたが、どうかご容赦下さい。
> 早速テスト用のプロジェクトを用意して、無事動作するところまで辿り着きましたが
> 現行は、前述の通りhttpsのページで送信しているので、SSLによる暗号化通信がされて
> いるのだと思います。そうなると「同じこと」を行っている事にはならない・・・?
>
> と、現在このあたりで行き詰っています。

  Webコンテンツも一般的にはFTPでアップロードします。
  ですので、FTPで既にできているのなら、問題ないかと・・・

  またHTTPで送りたいなら・・・
  FTPのTipsではなく、Httpの方にやり方は掲載されています。
  そのものズバリではありませんが、できます。

  因みに、FTPでは、認証がありますが、anoymouseでは無いです
  よね?!(当然か・・・)

以上。
オショウさん、回答ありがとうございます。

>   Webコンテンツも一般的にはFTPでアップロードします。
>   ですので、FTPで既にできているのなら、問題ないかと・・・
えっ、そうゆう事なんですか。なるほど。
まだまだ初級者で今回の件についてもホントに未経験な事ばかりでしたので、大変勉強になります。

という事は、うまく(用語とかが分からず)表現できませんが、平たく言うと
FTPでアップロードしていても、Httpsのページ(アドレス?)に対して行っているのであれば
SSL通信をしていることと「同じこと」を行っている。という理解でよろしいでしょうか?
#「ちゃんと動いたからいいや」ではなく、できるだけきちんと理解したいので…



>   因みに、FTPでは、認証がありますが、anoymouseでは無いです
>   よね?!(当然か・・・)
「anoymouse」これも初めて耳にするキーワードです。とりあえず検索してみました。
http://e-words.jp/w/anonymous20FTP.html

またも引継ぎの際の話(メモ)になりますが、
アップロード・ダウンロードのターゲットは、現在利用しているサーバーの
secureディレクトリの中の、cgi-binディレクトリで、SSL通信をする場合は
ここに配置する必要がある・・・といったような説明を受けました。
# だったかな??うろ覚えですが…

今回のテストプロジェクトでの動作確認の時はFFFTPを利用して、送信ファイルの確認をしましたが、
その際も、テスト用のアカウントを用意してもらい、ユーザー名・パスワードの設定をしました。
上記リンクのアカウント名を「anoymouse」とはしていないし、関係ない(大丈夫)・・・ですよね?



それと、今回参考にさせて頂いたTips↓についてもう少し理解したいのですが
http://dobon.net/vb/dotnet/internet/ftpwebrequest.html#uploadfile

> 'ASCIIモードで転送する
> ftpReq.UseBinary = False
> 'PASVモードを無効にする
> ftpReq.UsePassive = False
これらのプロパティは何を基準にTrue or Falseを使い分けるのでしょうか?

ちなみに、UseBinaryプロパティは、送信ファイルが解凍できない現象が起きたためTrueに変更しました。
UsePassiveプロパティは、ウイルスセキュリティの許可やファイアウォールのロック解除の選択画面が
表示される現象が起きたためTrueに変更してみました。

残りのアップロードStreamの部分のコードについては、ゆっくりと噛み砕いている最中です。

引続き助言頂ければ幸いです。よろしくお願いします。(またも長文で失礼しました)
> という事は、うまく(用語とかが分からず)表現できませんが、平たく言うと
> FTPでアップロードしていても、Httpsのページ(アドレス?)に対して行っているのであれば
> SSL通信をしていることと「同じこと」を行っている。という理解でよろしいでしょうか?
> #「ちゃんと動いたからいいや」ではなく、できるだけきちんと理解したいので…

  厳密に言うと違います。
  SSLで暗号化していますので、FTPでSSL使えるところはそうないので
  暗号化が必要ならHTTPS通信を行うべきでしょう。

  一応、FTPでSSL使えるかどうかは、そのサーバー機能に依存しますの
  で御調べになれば?(.NETのFTPではSSL使えなかったはずですが)

> 今回のテストプロジェクトでの動作確認の時はFFFTPを利用して、送信ファイルの確認をしましたが、
> その際も、テスト用のアカウントを用意してもらい、ユーザー名・パスワードの設定をしました。
> 上記リンクのアカウント名を「anoymouse」とはしていないし、関係ない(大丈夫)・・・ですよね?

  大丈夫です。
  因みにFFFTPですか?確かによく出回っているので知名度高いですが
  ネットワーク技術者はFFFTP使わない・・・いろいろ問題があったの
  で・・・まぁ〜一般的な送受信には問題ないと思いますが。

> それと、今回参考にさせて頂いたTips↓についてもう少し理解したいのですが
> http://dobon.net/vb/dotnet/internet/ftpwebrequest.html#uploadfile
>
>>'ASCIIモードで転送する
>>ftpReq.UseBinary = False
>>'PASVモードを無効にする
>>ftpReq.UsePassive = False
> これらのプロパティは何を基準にTrue or Falseを使い分けるのでしょうか?

  ええ〜と・・・
  ASCIIモード・BINARYモードは、送受信するファイル形式に依存します。
  PASVモードは、FTPサーバー側のタイプに依存します。

  自分で判断するのは送受信したいファイルがASCIIかBINARYかで.UseBinary
  を設定し、.UsePassiveは、サーバー側の仕様に合わせて設定することにな
  ります。

> ちなみに、UseBinaryプロパティは、送信ファイルが解凍できない現象が起きたためTrueに変更しました。

  そうでしょう〜ネ〜圧縮ファイルは、BINARYでないと無理!

> UsePassiveプロパティは、ウイルスセキュリティの許可やファイアウォールのロック解除の選択画面が
> 表示される現象が起きたためTrueに変更してみました。

  BINARYの場合、実行形式ファイルとしてのウィルスチェック対象なので
  そういう画面が出ることもあろうかと・・・

> 残りのアップロードStreamの部分のコードについては、ゆっくりと噛み砕いている最中です。
>
> 引続き助言頂ければ幸いです。よろしくお願いします。(またも長文で失礼しました)

  こちらのサイトの管理者殿が、より助言してくれるのでは?・・・
  と思いますが。

以上。
> 残りのアップロードStreamの部分のコードについては、ゆっくりと噛み砕いている最中です。

私が余計な事を言わなくても大丈夫だとは思いますが、

ファイルをバイト型配列に読み込む、バイト型配列をファイルに書き込む
http://dobon.net/vb/dotnet/file/filestream.html

をご理解いただければ(非同期云々は除外して)、問題ないでしょう。FTPでは書き込むStreamが違うだけです。
オショウさん、回答ありがとうございます。

>   厳密に言うと違います。
>   SSLで暗号化していますので、FTPでSSL使えるところはそうないので
>   暗号化が必要ならHTTPS通信を行うべきでしょう。
なるほどそうですか、よく分かりました。

すでに最初の回答で
>   またHTTPで送りたいなら・・・
>   FTPのTipsではなく、Httpの方にやり方は掲載されています。
>   そのものズバリではありませんが、できます。
とお聞きしてましたので、今の方法が落ち着いたらこちらの方も拝見してみようと思います。
その場合は、「POSTでデータを送信する」あたりが該当のTipsになるのかなと…?


>   ええ〜と・・・
>   ASCIIモード・BINARYモードは、送受信するファイル形式に依存します。
>   PASVモードは、FTPサーバー側のタイプに依存します。
>
>   自分で判断するのは送受信したいファイルがASCIIかBINARYかで.UseBinary
>   を設定し、.UsePassiveは、サーバー側の仕様に合わせて設定することにな
>   ります。
私でもイメージしやすく、とてもよく分かりました。


> > ちなみに、UseBinaryプロパティは、送信ファイルが解凍できない現象が起きたためTrueに変更しました。
>
>   そうでしょう〜ネ〜圧縮ファイルは、BINARYでないと無理!
>
> > UsePassiveプロパティは、ウイルスセキュリティの許可やファイアウォールのロック解除の選択画面が
> > 表示される現象が起きたためTrueに変更してみました。
>
>   BINARYの場合、実行形式ファイルとしてのウィルスチェック対象なので
>   そういう画面が出ることもあろうかと・・・
こちらにも回答を付けて頂き恐れ入ります。何故このような現象が起きたのかよく分かりました。



管理人さん、回答ありがとうございます。

> 残りのアップロードStreamの部分のコードについては、ゆっくりと噛み砕いている最中です。
とりあえず噛み砕きました。

> ファイルをバイト型配列に読み込む、バイト型配列をファイルに書き込む
> http://dobon.net/vb/dotnet/file/filestream.html
>
> をご理解いただければ(非同期云々は除外して)、問題ないでしょう。FTPでは書き込むStreamが違うだけです。
こちらも拝見させて頂きました。

噛み砕いただけで、呑み込めたかは微妙ですが…
アップロードStreamに、bufferから、readSize(バイト数)分だけ書込む。といった流れはイメージできました。

ただ一つだけ
> Dim buffer(1023) As Byte
# もしかしたら恥ずかしい質問なのしれませんが…
この場合の1023という数はどこから来てるのでしょうか?(固定値?)
こんにちは。
>.NETのFTPではSSL使えなかったはず
.NET側については、FTPWebRequestにはEnableSslプロパティがあるかと。
http://msdn.microsoft.com/ja-jp/library/system.net.ftpwebrequest.enablessl%28VS.80%29.aspx
「"AUTH TLS" コマンドがサーバーに送信され、暗号化セッションを要求します。
サーバーがこのコマンドを認識しない場合は、WebException 例外が発生します。」とのことで。
簡単なサンプルも載っています。(…が、私はSSLでのFTPは試していません。)
こど。さん、回答ありがとうございます。

> .NET側については、FTPWebRequestにはEnableSslプロパティがあるかと。
> http://msdn.microsoft.com/ja-jp/library/system.net.ftpwebrequest.enablessl%28VS.80%29.aspx
> 「"AUTH TLS" コマンドがサーバーに送信され、暗号化セッションを要求します。
> サーバーがこのコマンドを認識しない場合は、WebException 例外が発生します。」とのことで。
> 簡単なサンプルも載っています。(…が、私はSSLでのFTPは試していません。)
こちらについてもまずは今の方法が落ち着いたら拝見させて頂きます。

繰り返しになりますが、今回はホントに未経験な事ばかりでしたので
皆さんからの回答一つ一つが大変勉強になります。有難うございます。
>>Dim buffer(1023) As Byte
> # もしかしたら恥ずかしい質問なのしれませんが…
> この場合の1023という数はどこから来てるのでしょうか?(固定値?)

この値に特に意味はありません(1キロバイトということです)。適当なサイズにしていただいて結構です。
> この値に特に意味はありません(1キロバイトということです)。適当なサイズにしていただいて結構です。
管理人さん、回答ありがとうございます。

とりあえず一連の流れに沿ったコード内容もイメージできましたので、解決とさせていただきます。
これ以降は、現状のプロジェクトをVB2005以上に以降して、本番の改善に進みたいと思います。
# 実はプロジェクト移行も初経験となるため不安ですが。簡単にできるのか…な?

回答して頂いた皆さん、ありがとうございました。とても勉強になりました。
チェック忘れてました。すいません。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板