JavaWebファイルのアップロードとダウンロード

今日のインターネット時代では、より多くの人々がインターネット上で自分のデータを保存したいので、彼らは、このような360ネットワークディスク、ネットワークディスクBaiduのクラウドディスクのクラスのようなソフトウェアの多くの種類、を出産しました。そのため、ファイルのアップロードやダウンロード機能は、現在、非常に主流の関数であり、広く使用されています。
だから、今、私たちは、ファイルのアップロードを実現してダウンロードする方法を、ウェブでは、学ぶために持っています!
Web開発実装ファイルのアップロード機能は、以下の2段階の操作を完了します。
Webページにアップロードエントリを追加
サーブレットにファイルをアップロードされたデータを読み出すために、サーバのハードドライブに保存されました。
どのようにWebページにアップロードされたエントリを追加するには?
タグは、Webページのエントリでファイルのアップロードを追加するために使用するファイルアップロード項目を設定するとき、それは注意すべきである:
1、それ以外のブラウザでファイルをアップロードするためのデータを送信しません、name属性の入力項目を設定する必要があります。
この値がある場合は、フォームが。属のenctypeマルチパート/フォームデータの値に設定する必要があります2、ファイルをアップロードし、ブラウザは、データファイルには、HTTPリクエストメッセージの本文に含まれ、アップロードされたMIMEプロトコルファイルを使用することになりますアップロードされたデータを解析し、処理するための受信機を容易にするための説明、。
3、フォームの送信であればポスト

これは、特定の機能の達成に続いて、ページの実現です。

サーブレットファイルのアップロードデータを読み込み、およびハードドライブに保存します?方法
RequestオブジェクトのgetInputStreamメソッドを提供し、あなたはこの方法で来て、クライアントによって送信されたデータを読み取ることができます。ユーザーが複数のファイルをアップロードすることができるので、データの読み出し直接アップロードサーブレットプログラムの終了は、それぞれ、対応する分析データ・ファイルは、非常に面倒な作業です。

原理を知って、私たちは今、ケーススタディを書きます。
新しいWebプロジェクト。
Upload.jspファイルを作成します。

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
    <form action="/day20/upload">
        用户名:<input type="text" name="username"><br>
        上传文件:<input type="file" name="upload"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

その後、我々はUploadServletを作成します

package cn.itcast.servlet;

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //request提供getInputStream,用来获得请求体
        InputStream in = request.getInputStream();
        int temp;
        while((temp = in.read()) != -1){
            System.out.write(temp);
        }
        System.out.flush();
        in.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

だから私たちが書くコードが完全であること、そして私たちは、ファイルのアップロードのためのINFO.TXTファイルを準備します。

Defines methods that all servlets must implement. 

A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol. 

To implement this interface, you can write a generic servlet that extends javax.servlet.GenericServlet or an HTTP servlet that extends javax.servlet.http.HttpServlet. 

This interface defines methods to initialize a servlet, to service requests, and to remove a servlet from the server. These are known as life-cycle methods and are called in the following sequence: 

The servlet is constructed, then initialized with the init method. 
Any calls from clients to the service method are handled. 
The servlet is taken out of service, then destroyed with the destroy method, then garbage collected and finalized. 
In addition to the life-cycle methods, this interface provides the getServletConfig method, which the servlet can use to get any startup information, and the getServletInfo method, which allows the servlet to return basic information about itself, such as author, version, and copyright. 

準備作業が行われている、そして今、私たちはそれを実行しようとしなければなりません。
ここに画像を挿入説明
今、私たちは、要求の本体全体の要求オブジェクト情報ののgetInputStreamメソッドを介して取得しますが、要求はINFO.TXTファイル内だけで本文ありませんでした、いくつかの他のパラメータ情報があり、私たちは今、どのようにテキストの内容を取得しますそれは?この場所への鍵は、分割ラインということですが、情報私は、このような期間の分割ライン、それにテキストを持っている場合、一部の学生は、質問することができますか?私たちが、ヘッダを要求する情報を見てする必要があります。
ここに画像を挿入説明
すなわち、リクエストヘッダのパラメータは、分割線です。
分割線状況によって生成同じ、及びテキストコンテンツも起こり得るが、確率はほとんど無視できる、非常に小さいものの。
今、私たちは、リクエストボディの分割線で分割することができます。
セグメント化されたそれぞれの部分は、テキストコンテンツであり、決定されます。審判の基礎:そのテキストの内容を証明するために、flienameおよびコンテンツタイプが含まれているどの部分かを決定します。
原則は、私は自分自身を書くことができ、書き込みの特定の関心を達成することはありません、これです。

道に沿って、あなた自身が実際には非常に面倒で、ファイルのアップロードやダウンロードを達成見つけることができますが、幸い我々は、既製のツールを使用することができますがあります。
ユーザー・データ・ファイルのアップロードプロセスの利便性のために、Apacheのオープンソース、オープンソースコンポーネント(コモンズ-ファイルアップロード)を提供し、ファイルアップロードフォーム、優れたコンポーネントのパフォーマンスを処理するために使用され、その使用は、開発者が簡単にWebファイルを実装することができ、非常にシンプルなAPIでありますこのように、ウェブ開発に通常コモンズ・ファイルアップロードコンポーネントの実装を、ファイルアップロード機能を実現し、機能をアップロードします。
Servlet3.0後、サーブレットプログラム自体は、ファイルのアップロードをサポートしているかを知る必要があります。

しかし、我々はまだ瓶の使用について学ぶ必要があります。ここでダウンロードjarがあります。
リンクします。https://pan.baidu.com/s/1F-fS7JgfilSF9bLA8iVQuQ
抽出コード:3kfh
このオープンBaiduのネットワークディスク電話アプリケーションの内容をコピーし、より便利な操作オハイオ州

ダウンロードが完了したら、私たちのプロジェクトにjarファイルのパッケージを追加します。
その後、私はあなたが使用ブリーフィングます。
1は、工場DiskFileItemFactory ServletFileUploadによって構成されるパーサ
体パーサー要求分割線の様々な部分で、2は複数の部分を得るために分割され、各部分はFileItemある
。3、FileItemは多くのAPIを提供し、あなたはisFormFieldによるものであり得ます部分はファイルアップロード項目ではありませんかどうかを判断
ファイルアップロード項目は、あなたがのgetInputStreamを介してコンテンツのアップロードファイルを得ることができる場合、getNameがアップロードされたファイルの名前を取得し、4
ないファイルアップロード項目をフォームの項目名をアップロードgetFieldNameすることによって得ることができる場合には、5 getStringによってアップロードフォーム項目を取得プロパティ、プロパティ値

次に、我々はそれを達成するためにファイルをアップロードするには、サードパーティのAPIを使用します。

package cn.itcast.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //request提供getInputStream,用来获得请求体
        // InputStream in = request.getInputStream();
        // int temp;
        // while((temp = in.read()) != -1){
        // System.out.write(temp);
        // }
        // System.out.flush();
        // in.close();
        
        //步骤一   构造工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        
        //步骤二   获得解析器
        ServletFileUpload upload = new ServletFileUpload(factory);  
        
        //步骤三   对请求体内容进行解析
        try {
            List<FileItem> fList = upload.parseRequest(request);
            
            //步骤四   遍历集合
            for(FileItem fileItem : fList){
                //步骤五   判断每个fileItem是不是文件上传项
                if(fileItem.isFormField()){
                    //不是上传文件
                    String name = fileItem.getFieldName();
                    String value = fileItem.getString();
                    System.out.println("普通form项:" + name + "---" + value);
                }else{
                    //是上传文件
                    String fileName = fileItem.getName();
                    //解决老版本浏览器文件路径问题
                    if(fileName.contains("\\")){
                        fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                    }
                    InputStream in = fileItem.getInputStream();//得到的是文件内容
                    System.out.println("文件上传项:" + fileName);
                    //将内容写入文件
                    File file = new File("C:\\Users\\Administrator\\Desktop\\info_test.txt");
                    if(!file.exists()){
                        //文件不存在,创建文件
                        file.createNewFile();
                    }
                    FileOutputStream out = new FileOutputStream(file);
                    int len;
                    while((len = in.read()) != -1){
                        out.write(len);
                    }
                    in.close();
                    out.close();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

プロジェクトを実行し、それは、デスクトップ上に新しいファイルを生成するファイルを開き、テキストが正常にファイルに書き込まれているでしょう。

このように、非常に単純なケースファイルのアップロードが完了します。次に、我々は、コアクラスのFileUploadツールの詳細な調査を実施しました。

コアAPI - DiskFileItemFactory

:DiskFileItemFactoryオブジェクトは、FileItem工場、ファクトリクラス共通のメソッド作成された
パブリックDiskFileItemFactory(sizeThreshold、java.io.Fileのリポジトリのint)
コンストラクタを

公共ボイドsetSizeThreshold(sizeThresholdをint型)
メモリバッファのサイズが用意され、デフォルト値は10Kです。バッファサイズを超えるファイルをアップロードする際に、ファイルアップロードコンポーネントは、ファイルをアップロードするために、一時ファイルキャッシュを使用します。

公共ボイドsetRepository(java.io.Fileのリポジトリ)
の一時ファイルのディレクトリを指定し、デフォルト値はSystem.getProperty(「java.io.tmpdirの」)。

注意:バッファの内容で保存された優先順位アップロードファイルを、メモリバッファが十分でないとき、それはハードディスク上の一時ファイルを生成します、一時ファイル、ソースファイルと一時ファイルの同じ内容で指定されたディレクトリに保存された一時ファイル。
中国のゴミ問題を解決するためにどのようにして、いくつかの学生がrequeset.setCharacterEncodingを使用し、POSTリクエスト処理ゴミ問題を頼むかもしれない(「UTF-8」)はまだラインではありませんが、それは本当にここではない、私は、あなたが自分自身をテストすることができ、信じていません。試してみます。実際には、パーサに提供されるAPIは、中国の文字化けを解決するために。あなただけ解決することができますsetHeaderEncoding(「UTF-8」)メソッドを呼び出すことがServletFieUploadオブジェクトを使用する必要があります。
もう一つの問題は、アップロードが完了したときに、我々は一時ファイルを削除する必要があり、サーバーに負担を増加した、リクエスト数の増加とともに、一時的なファイルサーバは、より多くなるということです。最後の呼び出しFileItemオブジェクトプログラムで削除する()メソッドを削除します。

コアAPI - ServletFileUpload

アップロードされたファイルデータを処理する責任ServletFileUpload、各エントリは、フォームFileItemオブジェクトにカプセル化されます。一般的な方法:
ブールisMultipartContent(HttpServletRequestの要求)
マルチパート/フォームデータ型かどうかをアップロードフォームを決定
リストparseRequest(HttpServletRequestのリクエスト)
fileItemオブジェクトに充填されたリクエスト・オブジェクトと各フォームエントリを分析し、保存を返しますすべてFileItemのコレクションリスト。
setFileSizeMax(ロングfileSizeMax)
単一のアップロード最大提供
setSizeMax(ロングsizeMax)が
アップロードされたファイルの最大の総量提供
setHeaderEncoding(java.lang.Stringでエンコード)
エンコード形式の提供
(ProgressListener pListener)がsetProgressListenerを
リアルタイムでファイルアップロードの状態を監視します

注:ファイルがアップロードされている場合は、我々はgetFieldName()メソッド、そうでない場合は、ファイルをアップロードして、ファイル名を取得することができ、我々は、フォーム項目の値を取得するためのgetName()メソッド、のgetValue()メソッドによって、フォーム項目のname属性を取得することができ、これは、のgetValue ()メソッド得られたデータは、中国が、文字化けされている場合は、この時間は、基本的な処理化けAPIが動作しませんが、我々はそれが提供するAPIを使用することができ、心配しないでください。これは、パラメータとしてのgetString(のjava.lang.String符号化)方式、単にUTF-8をオーバーライドすることができます。

おすすめ

転載: www.cnblogs.com/blizzawang/p/11411699.html
おすすめ