Java Webファイルをアップロードしてダウンロードします。


ファイルのアップロードはウェブサイトにとって重要性は言うまでもない。今日はJava Web方式で実現されたファイルのアップロードとダウンロードの小例を共有します。
  • プロジェクト依存
  • プロジェクトディレクトリ
  • ワークフロー
  • ファイルアップロード
  • フォームにおける設定
  • サーバ端末
  • アップロード機能の実現
  • uplloadjsp
  • message jsp
  • UploadHandleServlet
  • webxml構成
  • 結果展示
  • ファイル閲覧
  • ListFileServletjava
  • listfiles jsp
  • webxml構成
  • スクリーンショット結果
  • 注意
  • パス問題
  • JSTLは
  • を使用します。
  • テンプレート変数
  • ファイルのダウンロード
  • Down LoadServletjava
  • webxml構成
  • スクリーンショット
  • を示す。
  • 総括
  • プロジェクト依存
    この小さい例はJava WebのJSP+Servletを用いて実現される。他にもいくつかの第三者のjarカバンを使用しています。以下を列挙します
  • apache-commons-fileupload.jar+apache-commons-io.jar:オープンソースのセットが使いやすいコンポーネント
  • jstl.jar+standard.jar:テンプレート言語jspで使用されるサポート
  • stringutil.jar:これは私が自分で書いたstringに対する簡単な操作jarです。ダウンロードhttps://github.com/guoruibiao/File_Upload_Download/blob/master/WebContit/WEB-INF/lib/strigutils.jar
  • これらの依存はいずれも容易に得られる。もちろん私のrepositoryで直接に入手することもできます。住所は以下の通りですhttps://github.com/guoruibiao/File_Upload_Download/blob/master/WebContent/WEB-INF/lib。
    プロジェクトディレクトリ
    プロジェクトを始める前に、プロジェクトリストを提供することで、私たちの考えがより明確になります。
    仕事の流れ
    新米にとって。web.xmlの配置については、頭が読めないかもしれませんので、図を描いてみます。
    Created with Rapha a l 2.10 URLリンクはurl-patternによって同じクラスのservlet-nameを見つけました。servlet-nameによって親タグservlet-mappingを取得して、servlet-mappingの兄弟ノードservletを取得して、servlet-mappingのservletの名前のタイトルに従って、同じ名前のタイトルのservlet-nameを取得することができます。servletタグからservlet-class属性の値を取得し、それを反射技術によりtomcat容器にそれぞれのクラスをロードする。一連の業務論理操作を行う。取得したデータをjspページテンプレートユーザに転送してビューを取得します。
    ファイルアップロード
    コードを始める前に、私たちはもっと基礎的な知識を知る必要があります。ちょっとうるさいと思うかもしれませんが、これらを知らない子供用の靴の世話をするために、もっと話しましょう。
    フォームの設定
    ファイルをアップロードする機能を作るには、フォームで行う必要があります。ですから、私たちはルールを守る必要があります。
    <form
            action="${pageContext.request.contextPath }/servlet/UploadHandleServlet"
            enctype="multipart/form-data" method="post">
                :<input type="text" name="username"><br>     1:<input
                type="file" name="file1"><br>     2:<input type="file"
                name="file2"><br> <input type="submit" value="  ">
        </form>
    このフォームを例にとると、私たちは見つけにくくないです。enctype="multipart/form-data"この行のコードは、サーバに伝える役割を果たしています。このフォームはファイルアップロード処理に使用されます。
    サーバ端
    フォームによるアップロードは便利ですが、ファイル以外のフォームはどうなりますか?この時には、apache-commons-fileuploadのファイル処理について理解したいです。
    
    try {
                //   Apache             
                // 1、    DIskFileItemFactory  
                DiskFileItemFactory factory = new DiskFileItemFactory();
                // 2、           
                ServletFileUpload uploadparser = new ServletFileUpload(factory);
                // 3、           ;                   
                uploadparser.setHeaderEncoding("UTF-8");
                if (!ServletFileUpload.isMultipartContent(request)) {
                    //       ,           
                    return;
                }
                // 4、  ServletFileUpload          ,          List<File>  ,  Item          
                List<FileItem> files = uploadparser.parseRequest(request);
                for (FileItem fileitem : files) {
                    //   fileitem              
                    if (fileitem.isFormField()) {
                        String name = fileitem.getFieldName();
                        //                  
                        String value = fileitem.getString("UTF-8");
                        System.out.println(name + " = " + value);
                    } else {//   fileitem           ,            
                        String filename = fileitem.getName();
                        System.out.println(fileitem);
                        if (filename == null || filename.trim().equals("")) {
                            continue;
                        }
                        //   :                 ,                        ,     。            ,         
                        filename = StringUtils.getFileName(filename);
                        //   fileitem         
                        InputStream is = fileitem.getInputStream();
                        //          
                        FileOutputStream fos = new FileOutputStream(savePath + "\\" + filename);
                        //        
                        byte[] buffer = new byte[1024];
                        //                   
                        int len = 0;
                        while ((len = is.read(buffer)) > 0) {
                            //                 
                            fos.write(buffer, 0, len);
                        }
                        is.close();
                        fos.close();
                        fileitem.delete();
                        message = new String("Upload Success!".getBytes(), "UTF-8");
    
                    }
                }
    
            } catch (Exception e) {
                message = new String("Upload Failed!".getBytes(), "UTF-8") + e;
                e.printStackTrace();
            }
    アップロード機能の実現
    はい、以下からアップロード機能の実現を開始します。
    uplload.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>    </title>
    </head>
    <body>
        <form  action="${pageContext.request.contextPath }/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post"><input type="text" name="username"><br>     1:<input  type="file" name="file1"><br>     2:<input type="file" name="file2"><br> <input type="submit" value="  ">
        </form>
    
    </body>
    </html>
    message.jsp
    ソフトウェアを使用する過程で、ユーザーにより友好的なユーザー体験を提供するために、ユーザーと一方的に対話する(簡単なヒント機能)ページを追加しました。コードプロセスを伝えるために必要な情報。
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>    </title>
    </head>
    <body>${message }
    </body>
    </html>
    UploadHandleServlet
    package controller;
    
    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.annotation.WebServlet;
    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.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    
    import stringutil.StringUtils;
    
    public class UploadHandleServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        public UploadHandleServlet() {
            super();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.getWriter().append("Served at: ").append(request.getContextPath());
            //            ,                  WEB-INF   
    // String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
            String savePath = "E://Code/jee/File_upload_download/WebContent/WEB-INF/upload";
            File file = new File(savePath);
            //              
            if (!file.exists() && !file.isDirectory()) {
                System.out.println(savePath + " Need to Make Directory named ‘upload’!");
                //       
                file.mkdir();
            }
    
            //     
            String message = "";
            try {
                //   Apache             
                // 1、    DIskFileItemFactory  
                DiskFileItemFactory factory = new DiskFileItemFactory();
                // 2、           
                ServletFileUpload uploadparser = new ServletFileUpload(factory);
                // 3、           ;                   
                uploadparser.setHeaderEncoding("UTF-8");
                if (!ServletFileUpload.isMultipartContent(request)) {
                    //       ,           
                    return;
                }
                // 4、  ServletFileUpload          ,          List<File>  ,  Item          
                List<FileItem> files = uploadparser.parseRequest(request);
                for (FileItem fileitem : files) {
                    //   fileitem              
                    if (fileitem.isFormField()) {
                        String name = fileitem.getFieldName();
                        //                  
                        String value = fileitem.getString("UTF-8");
                        System.out.println(name + " = " + value);
                    } else {//   fileitem           ,            
                        String filename = fileitem.getName();
                        System.out.println(fileitem);
                        if (filename == null || filename.trim().equals("")) {
                            continue;
                        }
                        //   :                 ,                        ,     。            ,         
                        filename = StringUtils.getFileName(filename);
                        //   fileitem         
                        InputStream is = fileitem.getInputStream();
                        //          
                        FileOutputStream fos = new FileOutputStream(savePath + "\\" + filename);
                        //        
                        byte[] buffer = new byte[1024];
                        //                   
                        int len = 0;
                        while ((len = is.read(buffer)) > 0) {
                            //                 
                            fos.write(buffer, 0, len);
                        }
                        is.close();
                        fos.close();
                        fileitem.delete();
                        message = new String("Upload Success!".getBytes(), "UTF-8");
    
                    }
                }
    
            } catch (Exception e) {
                message = new String("Upload Failed!".getBytes(), "UTF-8") + e;
                e.printStackTrace();
            }
            request.setAttribute("message", message);
            request.getRequestDispatcher("/message.jsp").forward(request, response);
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    
    web.xml設定
    <servlet>
            <servlet-name>UploadHandleServlet</servlet-name>
            <servlet-class>controller.UploadHandleServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>UploadHandleServlet</servlet-name>
            <url-pattern>/servlet/UploadHandleServlet</url-pattern>
        </servlet-mapping>
    結果の展示
    ファイル一覧
    ダウンロード機能を実現するには、まずユーザーを指導する必要があります。それは私たちのウェブサイトに何がありますか?だから、私たちはウェブサイトにダウンロードのフォルダを提供したいです。
    考えは以下の通りです
    Created with Rapha_l 2.10は、upladフォルダに位置し、サービスロジックをservletで完成させ、ファイル情報を格納したMapセットを取得し、JSPページにセットして展示します。ユーザーはページビューを獲得します。
    ListFileServlet.java
    package controller;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import stringutil.StringUtils;
    
    
    /** * Servlet implementation class ListFileServlet */
    @WebServlet("/ListFileServlet")
    public class ListFileServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        /** * @see HttpServlet#HttpServlet() */
        public ListFileServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.getWriter().append("Served at: ").append(request.getContextPath());
            //          
            String uploadPath = "E://Code/jee/File_upload_download/WebContent/WEB-INF/upload";
            //          
            Map<String, String> filenameMap = new HashMap<String, String>();
            //     filePath           ,           Map   
            listFile(new File(uploadPath), filenameMap);
            //          ,           
            request.setAttribute("filenameMap", filenameMap);
            request.getRequestDispatcher("/listfiles.jsp").forward(request, response);
        }
    
        public void listFile(File file, Map<String, String> filenameMap) {
            //   file         ,      
            if (!file.isFile()) {
                //                 
                File[] files = file.listFiles();
                //   files[]   
                for (File f : files) {
                    //   
                    listFile(f, filenameMap);
                }
            } else {
                //        strigutil        ,       
                String realName = StringUtils.getFileName(file.getName());
                try {
                    filenameMap.put(new String(file.getName().getBytes("iso8859-1"),"UTF-8"), realName);
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
    
        }
    
        /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    
    listfiles.jsp
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE HTML>
    <html>
    <head>
    <title>        </title>
    </head>
    
    <body>
        <!--   Map   -->
        <c:forEach var="me" items="${filenameMap}">
            <c:url value="/servlet/DownLoadServlet" var="downurl">
                <c:param name="filename" value="${me.key}"></c:param>
            </c:url>
             ${me.value}<a href="${downurl}">Download now?</a>
            <br />
        </c:forEach>
    </body>
    </html>
    web.xml設定
    <servlet>
            <servlet-name>ListFileServlet</servlet-name>
            <servlet-class>controller.ListFileServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>ListFileServlet</servlet-name>
            <url-pattern>/servlet/ListFileServlet</url-pattern>
        </servlet-mapping>
    スクリーンショットの結果
    注意
    ここにはいくつかの間違いがあります。注意が必要です。
    パスの問題this.getServletContext().getRealPath("/WEB-INF/upload");を使う過程で問題が発生しましたので、ここでは絶対パスを使っています。自分の状況を自由に選んでください。
    JSTL使用
    JSTLラベルライブラリを使う時は、関連のjarバッグを導入することを忘れないでください。その後、JSPページの上に該当する声明を記入します。あと、URI属性は間違えないようにしてください。<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>です
    テンプレート変数<c:forEach>ラベルの内部で、使用する<c:param name="filename" value="${me.key}"></c:param>パラメータは必ず間違えないようにしてください。私たちはこの中のname="filename"属性によって、私たちがダウンロードしたいファイルの情報を一意に確定します。
    ファイルのダウンロード
    ファイルのダウンロード機能自体は難しくないです。コアはブラウザのheaderに何かを教えて、フロー操作でダウンロードするデータをクライアントブラウザに送信すればいいです。
    Down LoadServlet.java
    package controller;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import stringutil.StringUtils;
    
    /** * Servlet implementation class DownLoadServlet */
    @WebServlet("/DownLoadServlet")
    public class DownLoadServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        /** * @see HttpServlet#HttpServlet() */
        public DownLoadServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            //          
            String filename = request.getParameter("filename");
            filename = new String(filename.getBytes("iso8859-1"), "UTF-8");
            //                upload     .
    
            String fileSaveRootPath = "E://Code/jee/File_upload_download/WebContent/WEB-INF/upload";
            //               
            //         ,             
            // String filePath =
            // findFileSavePathByFileName(filename,fileSaveRootPath);
            String filePath = fileSaveRootPath;
            //         
            File file = new File(filePath + "\\" + filename);
            //        
            if (!file.exists()) {
                request.setAttribute("message", "The File you want to download doesn't exists!");
                request.getRequestDispatcher("/message.jsp").forward(request, response);
                return;
            }
            //      
            String realname = StringUtils.getFileName(filename);
            //      
            response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8"));
            //         ,        
            FileInputStream fis = new FileInputStream(filePath + "\\" + filename);
            //      
            OutputStream os = response.getOutputStream();
            //      
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = fis.read(buffer)) > 0) {
                os.write(buffer, 0, len);
            }
            fis.close();
            os.close();
    
        }
    
        private String findFileSavePathByFileName(String filename, String fileSaveRootPath) {
            int hashcode = filename.hashCode();
            int dir1 = hashcode & 0xf; // 0--15
            int dir2 = (hashcode & 0xf0) >> 4; // 0--15
            String dir = fileSaveRootPath + "\\" + dir1 + "\\" + dir2;
            File file = new File(dir);
            if (!file.exists()) {
                //     
                file.mkdir();
            }
            return dir;
        }
    
        /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    
    web.xml設定
    <servlet>
            <servlet-name>DownLoadServlet</servlet-name>
            <servlet-class>controller.DownLoadServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>DownLoadServlet</servlet-name>
            <url-pattern>/servlet/DownLoadServlet</url-pattern>
        </servlet-mapping>
    スクリーンショット展示
    締め括りをつける
    最後にプロジェクト全体のまとめについて。apache-commons-fileuploadコンポーネントを使用するのは確かに便利です。フォームにアップロードされたデータをList<fileItem>にパッケージすることができます。このセットを巡回操作するだけで、自分の必要な内容を自由に設定できます。
    最後に、皆さんが見終わったら、何か収穫がありますように。自分のウェブサイトの機能を更に豊かにさせます。
    完全なプロジェクトのダウンロード住所は以下の通りです。https://github.com/guoruibiao/File_Upload_Download/です。いらっしゃいませ