要約: この記事では、JavaBean が複数のファイルのアップロードを実装するための 2 つの方法 (それぞれ http プロトコルと FTP プロトコルを使用) を紹介します。まず、http プロトコルを介して複数のファイルを転送する基本的な形式とアップロードの詳細なプロセスについて説明し、次に ftpclient クラスを使用して ftp アップロードを実装する方法を簡単に紹介し、最後に 2 つの方法を比較します。
キーワード: JavaBean、http、ftp、ftpclient
JavaBean は、Java ベースのソフトウェア コンポーネントです。 JSP は、Web アプリケーションに JavaBean コンポーネントを統合するための完全なサポートを提供します。このサポートにより、開発時間が短縮されるだけでなく (テスト済みで信頼されている既存のコンポーネントを直接使用できるため、繰り返しの開発を回避できます)、JSP アプリケーションのスケーラビリティも向上します。
ファイルアップロード機能は、B/S ベースの開発モデルでは非常に一般的です。他の開発ツールと比較すると、JSP のファイル アップロードのサポートは完全ではありません。ASP のようにコンポーネントを完成させる必要もありませんし、PHP のようにファイル アップロードのサポートを直接提供することもありません。 JSP がファイル アップロードを実装する方法は次のとおりです。ServletRequest クラスの getInputStream() メソッドを使用して、クライアントからサーバーに送信されたデータ ストリームを取得します。次に、このデータ ストリームを処理して、さまざまなパラメータと渡されるパラメータを分析して取得します。ファイルデータのアップロード中にサーバーにアクセスし、ファイルデータをファイルとして保存するか、データベースに挿入します。通常、JSP ページではファイルのアップロード機能は扱いませんが、これらの機能をサーブレットまたは JavaBeans に組み込んで実装します。サーブレットを使用してファイルのアップロードを完了する例は、JSP 関連の書籍で紹介されています。ここでは、JeanBean を使用してファイルのアップロードを完了する方法を紹介します。 JSP でファイルをアップロードするには、HTTP プロトコルと FTP プロトコルの 2 つの方法があります。この 2 つは送信原理に大きな違いがあります。以下では、ソース コードに基づいて実装について簡単に説明します。読者はそこから何かを得ることができると思います。次のプログラムはデバッグされ、合格しました。デバッグ環境:Windows 2000サーバ+Apache+tomcat4.0、JavaBeanデバッグ環境:JDK1.4+Editplus。
JSPでJavaBeanを使用してWebベースのファイルアップロード機能を実装するには、一般的に3種類のファイルを組み合わせる必要があります。これら 3 つのファイルは、それぞれ、インターフェイスを提供する HTML ページ ファイル、JavaBean のアップロード機能を実装するための呼び出しを完了する JSP ファイル、および JavaBean を実装する Java クラス ファイルです。以下では、HTTP プロトコルと FTP プロトコルを使用してファイルのアップロード機能を実装する JavaBean 部分に焦点を当てます。
1 HTTP プロトコルを使用して複数のファイルをアップロードします。
以前の HTML では、フォームはファイルをアップロードできず、一部の Web ページの機能が制限されていました。 RFC1867 仕様 (つまり、HTML でのフォームベースのファイル アップロード) はフォームを拡張し、フォーム要素 <input type=file> を追加します。この要素を使用すると、ブラウザは入力ボックスとボタンを自動的に生成します。入力ボックスを使用すると、ユーザーはローカル ファイル名とパス名を入力でき、ボタンを使用すると、ブラウザはユーザーのファイル選択ボックスを開くことができます。ファイルを選択します。具体的なフォームの実装は次のとおりです:
<FORMMETHOD="POST" ACTION="*.jsp" ENCTYPE="multipart/form-data">
<INPUT TYPE="FILE" NAME="FILE1" SIZE="50"><BR>
<INPUT TYPE="SUBMIT" VALUE="アップロード">
</FORM>
ファイルを貼り付けることを選択した場合は、ローカル ファイルの絶対パスを直接入力します。フォームの action 属性値は *.jsp です。これは、リクエスト (アップロードされたファイルを含む) が .jsp に送信されることを意味します。 *..jsp ファイル。このプロセスでは、実際に HTTP 経由でのファイルのアップロードが実装されます。クライアントからサーバーへのファイルのアップロードは、HTTP プロトコルの Common Gateway Interface (CGI) によってサポートされています。このアップロード方法では、ブラウザと WEBServer の両方が Rfc1867 をサポートしている必要があります。 JavaBeanは、クライアントからサーバに送信されたデータストリームをServletRequestクラスのgetInputStream()メソッドで取得し、アップロードされたファイルの形式を解析し、解析結果に基づいて複数のファイルをサーバ側の対象ファイルに順次出力します。この例の JavaBeande の機能は、testUpload クラスによって具体的に実装されています。 TestUpload クラスのフレームワークは次のとおりです。
public class testUpload
{
public testUpload(){……}
public Final voidInitialize(ServletConfig config) は ServletException をスローします
{ m_application = config.getServletContext(); }
public void Upload() は testUploadException、IOException、ServletException をスローします
{…………}
private void getDataSection(){………}
private void getDataHeader(){………}
public int save (String destPathName)
SmartUploadException、IOException、ServletException をスローします
{…………}
…
initialize
() メソッドを通じてサーブレットの実行環境を初期化します。 Upload() メソッドを使用して入力ストリームを取得し、アップロードされたファイルの形式を分析し、アップロードされた各ファイルの属性を複数の File クラス インスタンスに割り当てて処理します。これらの File クラス インスタンスは Files クラスによって管理されます。 Fileクラスは、各ファイルの属性に応じてsave()メソッドを呼び出し、複数のファイルをサーバー側の対象ファイルに順番に出力します。 Upload() メソッドは、http1.1 プロトコルによって送信されるファイルの形式を解析するために使用されるキーです。テスト後、トランスポート ストリーム ファイルの形式が得られます。これは、upload() メソッドを理解するのに役立ちます。たとえば、My Documentstt.txt ファイルをアップロードします。形式は次のとおりです。
//ファイル区切り文字
------------------------7d226137250336
//ファイル情報ヘッダー
コンテンツの配置: フォームデータ名 = "ファイル 1";
コンテンツタイプ: テキスト/プレーン
//ソースファイルの内容
テーブル情報の作成(
コンテンツ画像 null);
//次のファイルの区切り文字
------------------------7d226137250336
コンテンツの配置: フォームデータ名 = "ファイル名 = ";
Content-Type: application/octet-stream
--------------------------------7d226137250336
上記のファイルから、複数のファイルをアップロードする場合、HTTP プロトコルはすべてこれらは入力ストリームに入れられ、特定の区切り文字によって区別されます。実際、upload()メソッドは上記のファイルを解析し、区切り文字の内容、各ファイルの内容形式、ファイルのフルパス名、ファイルの実データの先頭と末尾を判断します。ここで注意すべき点の 1 つは、区切り文字はランダムであり、トランスポート ストリーム ファイルの最初の復帰文字より前のすべての文字であることです。
Upload() メソッドの実装プロセスは次のとおりです。まず入力ストリーム ファイルをバイト配列 m_binArray に出力します。これは次のコードによって実装されます。
m_totalBytes=1024;
for(; totalRead < m_totalBytes; totalRead += readBytes)
試す
{ m_request.getInputStream();
readBytes = m_request.getInputStream().read(m_binArray, totalRead, m_totalBytes - totalRead);
}catch(Exception e){ throw new SmartUploadException("アップロードできません。");}
ここでは、ループ内のマルチバイト読み取りメソッドが使用されています。上記のループは、配列がいっぱいになるまでデータを継続的に読み取ります。ファイルを完全に取得できる場合は、ファイルのすべてのバイトも取得できます。ただし、ネットワーク速度は通常 CPU よりもはるかに遅いため、すべてのデータが到着する前にプログラムがネットワーク バッファをクリアするのは簡単です。実際、一時的に空であるが開いているネットワーク バッファからデータを読み取ろうとすると、マルチバイト読み取りメソッドは 0 を返します。これは、データは存在しないがネットワーク ストリームが閉じられていないことを意味します。この場合、シングルバイト メソッドは実行中のプログラムの実行を妨げるため、マルチバイト メソッドの動作はシングルバイトの read() メソッドよりも優れています。次に、バイト配列 m_binArray が分析されます。まず区切り文字を見つけます。getDataHeader() メソッドを使用してファイル情報ヘッダーの値を返します。そこから、ソース ファイルの完全なパス名、ソース ファイル拡張子、およびソース ファイルのコンテンツ形式が決定されます。ファイルコンテンツデータを返し、それを記録するメソッド。バイト配列内のファイルデータの開始位置と終了位置。次に、File クラス インスタンスを生成し、ファイルのフル パス名、ソース ファイルの拡張子、ソース ファイルのコンテンツ形式、ファイルのコンテンツ データの開始位置と終了位置を File クラス インスタンスの属性に入力します。次の区切り文字を見つけて、分析が完了するまで上記のプロセスを繰り返します。
2 FTP プロトコルを使用して複数のファイルをアップロードします。
FTP プロトコルは、インターネット上でファイルを相互に転送するためのプロトコルです。この関数を Java で実装するには、FtpClient クラスを使用します。具体的な実装プロセス: まず、FTP サーバーとの接続を確立し、ASCII および BINARY を含むファイル送信メソッドを初期化します。ファイル入力ストリーム FileInputStream 内のデータをバイト配列に読み取ります。データは出力ストリーム TelnetOutputStream に書き込まれます (write メソッドを使用してデータをネットワーク リンクに書き込みます)。このようにして、ソース ファイルと同じ名前のファイルがサーバーにコピーされます。この例では、JavaBean は、connectServer()、upload()、および closeConnect() の 3 つのメソッドを通じてファイル アップロード プロセスを完了します。主な実装は次のとおりです。
public class ftpUpload
{ 文字列ファイル名;文字列ファイル名 1;FtpClient ftpClient;
public void connectServer(string サーバー,string ユーザー,string パスワード,string パス)
{
//server: FTP サーバーの IP アドレス user: FTP サーバーにログインするユーザー名;
//password: FTP サーバーにログインするためのユーザー名のパスワード path: FTP サーバー上のパス;
try{ ftpClient=new FtpClient();
ftpClient.openServer(サーバー);
ftpClient.login(ユーザー、パスワード);
System.out.println("ログイン成功!");
if (path.length()!=0) ftpClient.cd(path);
ftpClient.binary(); }catch (IOException ex) {System.out.println(ex);}
}
public void closeConnect()
{try{ ftpClient.closeServer();
}catch (IOException ex) {System.out.println(ex);}
}
パブリックボイドアップロード()
{ filename1=findFileName(ファイル名);
//ファイル名からファイル名を解析して対象ファイル名として使用する 具体的な方法は記載しておりません。
試す {
TelnetOutputStream os=ftpClient.put(ファイル名1);
java.io.File file_in=new java.io.File(ファイル名);
FileInputStream is=new FileInputStream(file_in);
byte[] bytes=新しいバイト[1024];
int c;
while ((c=is.read(bytes))!=-1){ os.write(bytes,0,c);
os.close();
catch (IOException ex) {System.out.println(ex);}
}
、
FTP サーバーとの接続を確立する機能を完了し、FtpClient の openServer(string server) メソッドを使用してリモート FTP サーバーを開き、次に FtpClient の login(user, password) メソッドを使用してサーバーにログインします。リモート FTP サーバーにログインするには、登録ユーザーとしてログインする方法と匿名でログインする方法の 2 つがあります。前者では、ユーザーはまずサーバーのクライアントとして登録する必要があり、サーバーはユーザーにログイン アカウントとパスワードを与え、そのアカウントとパスワードに基づいてサーバーに接続します。後者では、ユーザーは、リモート ホスト上の公開ファイルへのアクセスを制限するために登録せずに、特別なユーザー名「annoymous」および「guest」を使用する必要があります。現在、多くのシステムでは、ユーザーが自分の電子メール アドレスをパスワードとして使用する必要があります。セキュリティ上の理由から、ほとんどの匿名 FTP ホストは通常、リモート ユーザーにファイルのダウンロードのみを許可しますが、これは FTP サーバーの設定によって異なります。ユーザーは実際の状況に応じて 2 つの方法を選択できます。ログイン後、FtpClientのbinary()メソッドを使用して、送信モードをバイトモードに初期化します。 Upload() はファイルのアップロード関数を完了します。ソース ファイルのファイル入力ストリーム FileInputStream を作成し、入力ストリームをバイト配列に書き込み、TelnetOutputStream の write メソッドを使用してバイト配列内のデータをネットワーク リンクに書き込みます。 TelnetOutputStreamはFTPサーバー上のファイルをオープンするので、対象のファイルにデータが書き込まれ、ファイルのアップロードが完了します。 closeConnect() を使用するには、サーバーからの切断が必要です。
上記は単一のファイルをアップロードする処理のみです。複数のファイルがある場合、このアップロード処理は複数回呼び出すことができます。上記の 2 つの方法から、FTP プロトコルを使用して複数のファイルをアップロードするのは比較的シンプルで実装が簡単であることがわかります。通常、FTP プロトコルを使用してファイルをアップロードする場合はクライアント側のプログラムであり、サーバー側のセキュリティ設定はより複雑になりますが、HTTP プロトコルを使用してファイルをアップロードする場合はサーバー側のアプリケーションであり、セキュリティ設定は比較的単純になります。 。テストを通じて、大きなファイルを送信する場合、FTP アップロード方法は HTTP アップロード方法よりも数十倍、さらには数百倍高速ですが、1M 未満のファイルを送信する場合は HTTP アップロード方法よりわずかに遅いことがわかりました。したがって、どちらの送信方法にも独自の利点があるため、読者はそれぞれの状況に応じて行動することをお勧めします。ご質問がある場合、または他の部分のソースコードが必要な場合は、私までご連絡ください。