<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    學習 學習 再學習

    學習才是唯一的出路

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      31 隨筆 :: 1 文章 :: 8 評論 :: 0 Trackbacks

    名稱:jsp頁面上傳類

    特點

    1. 可以多文件上傳;
    2. 返回上傳后的文件名;
    3. form表單中的其他參數也可以得到。

    先貼上傳類,JspFileUpload

    package com.vogoal.util;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Hashtable;
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    /*
    * vogoalAPI 1.0
    * Auther SinNeR@blueidea.com
    * by vogoal.com
    * mail: vogoals@hotmail.com
    */
    /**
    * JSP上傳文件類
    *
    * @author SinNeR
    * @version 1.0
    */
    public class JspFileUpload {
        /** request對象 */
        private HttpServletRequest request = null;
        /** 上傳文件的路徑 */
        private String uploadPath = null;
        /** 每次讀取得字節的大小 */
        private static int BUFSIZE = 1024 * 8;
        /** 存儲參數的Hashtable */
        private Hashtable paramHt = new Hasptable();
        /** 存儲上傳的文件的文件名的ArrayList */
        private ArrayList updFileArr = new ArrayList();
        /**
         * 設定request對象。
         *
         * @param request
         *            HttpServletRequest request對象
         */
        public void setRequest(HttpServletRequest request) {
            this.request = request;
        }
        /**
         * 設定文件上傳路徑。
         *
         * @param path
         *            用戶指定的文件的上傳路徑。
         */
        public void setUploadPath(String path) {
            this.uploadPath = path;
        }
        /**
         * 文件上傳處理主程序。�������B
         *
         * @return int 操作結果 0 文件操作成功;1 request對象不存在。 2 沒有設定文件保存路徑或者文件保存路徑不正確;3
         *         沒有設定正確的enctype;4 文件操作異常。
         */
        public int process() {
            int status = 0;
            // 文件上傳前,對request對象,上傳路徑以及enctype進行check。
            status = preCheck();
            // 出錯的時候返回錯誤代碼。
            if (status != 0)
                return status;
            try {
                // ��參數或者文件名�u��
                String name = null;
                // 參數的value
                String value = null;
                // 讀取的流是否為文件的標志位
                boolean fileFlag = false;
                // 要存儲的文件。
                File tmpFile = null;
                // 上傳的文件的名字
                String fName = null;
                FileOutputStream baos = null;
                BufferedOutputStream bos = null;
                // ��存儲參數的Hashtable
                paramHt = new Hashtable();
                updFileArr = new ArrayList();
                int rtnPos = 0;
                byte[] buffs = new byte[BUFSIZE * 8];
                // �取得ContentType
                String contentType = request.getContentType();
                int index = contentType.indexOf("boundary=");
                String boundary = "--" + contentType.substring(index + 9);
                String endBoundary = boundary + "--";
                // �從request對象中取得流。
                ServletInputStream sis = request.getInputStream();
                // 讀取1行
                while ((rtnPos = sis.readLine(buffs, 0, buffs.length)) != -1) {
                    String strBuff = new String(buffs, 0, rtnPos);
                    // 讀取1行數據�n��
                    if (strBuff.startsWith(boundary)) {
                        if (name != null && name.trim().length() > 0) {
                            if (fileFlag) {
                                bos.flush();
                                baos.close();
                                bos.close();
                                baos = null;
                                bos = null;
                                updFileArr.add(fName);
                            } else {
                                Object obj = paramHt.get(name);
                                ArrayList al = new ArrayList();
                                if (obj != null) {
                                    al = (ArrayList) obj;
                                }
                                al.add(value);
                                System.out.println(value);
                                paramHt.put(name, al);
                            }
                        }
                        name = new String();
                        value = new String();
                        fileFlag = false;
                        fName = new String();
                        rtnPos = sis.readLine(buffs, 0, buffs.length);
                        if (rtnPos != -1) {
                            strBuff = new String(buffs, 0, rtnPos);
                            if (strBuff.toLowerCase().startsWith(
                                    "content-disposition: form-data; ")) {
                                int nIndex = strBuff.toLowerCase().indexOf(
                                        "name=\"");
                                int nLastIndex = strBuff.toLowerCase().indexOf(
                                        "\"", nIndex + 6);
                                name = strBuff.substring(nIndex + 6, nLastIndex);
                            }
                            int fIndex = strBuff.toLowerCase().indexOf(
                                    "filename=\"");
                            if (fIndex != -1) {
                                fileFlag = true;
                                int fLastIndex = strBuff.toLowerCase().indexOf(
                                        "\"", fIndex + 10);
                                fName = strBuff.substring(fIndex + 10, fLastIndex);
                                fName = getFileName(fName);
                                if (fName == null || fName.trim().length() == 0) {
                                    fileFlag = false;
                                    sis.readLine(buffs, 0, buffs.length);
                                    sis.readLine(buffs, 0, buffs.length);
                                    sis.readLine(buffs, 0, buffs.length);
                                    continue;
                                }else{
                                    fName = getFileNameByTime(fName);
                                    sis.readLine(buffs, 0, buffs.length);
                                    sis.readLine(buffs, 0, buffs.length);
                                }
                            }
                        }
                    } else if (strBuff.startsWith(endBoundary)) {
                        if (name != null && name.trim().length() > 0) {
                            if (fileFlag) {
                                bos.flush();
                                baos.close();
                                bos.close();
                                baos = null;
                                bos = null;
                                updFileArr.add(fName);
                            } else {
                                Object obj = paramHt.get(name);
                                ArrayList al = new ArrayList();
                                if (obj != null) {
                                    al = (ArrayList) obj;
                                }
                                al.add(value);
                                paramHt.put(name, al);
                            }
                        }
                    } else {
                        if (fileFlag) {
                            if (baos == null && bos == null) {
                                tmpFile = new File(uploadPath + fName);
                                baos = new FileOutputStream(tmpFile);
                                bos = new BufferedOutputStream(baos);
                            }
                            bos.write(buffs, 0, rtnPos);
                            baos.flush();
                        } else {
                            System.out.println("test :" + value + "--" + strBuff);
                            value = value + strBuff;
                        }
                    }
                }
            } catch (IOException e) {
                status = 4;
            }
            return status;
        }
        private int preCheck() {
            int errCode = 0;
            if ( request == null )
                return 1;
            if ( uploadPath == null || uploadPath.trim().length() == 0 )
                return 2;
            else{
                File tmpF = new File(uploadPath);
                if (!tmpF.exists())
                    return 2;
            }
            String contentType = request.getContentType();
            if ( contentType.indexOf("multipart/form-data") == -1 )
                return 3;
            return errCode;
        }
        public String getParameter(String name){
            String value = "";
            if ( name == null || name.trim().length() == 0 )
                return value;
            value = (paramHt.get(name) == null)?"":(String)((ArrayList)paramHt.get(name)).get(0);
            return value;
        }
        public String[] getParameters(String name){
            if ( name == null || name.trim().length() == 0 )
                return null;
            if ( paramHt.get(name) == null )
                return null;
            ArrayList al = (ArrayList)paramHt.get(name);
            String[] strArr = new String[al.size()];
            for ( int i=0;i<al.size();i++ )
                strArr[i] = (String)al.get(i);
            return strArr;
        }
        
        public int getUpdFileSize(){
            return updFileArr.size();
        }
        
        public String[] getUpdFileNames(){
            String[] strArr = new String[updFileArr.size()];
            for ( int i=0;i<updFileArr.size();i++ )
                strArr[i] = (String)updFileArr.get(i);
            return strArr;
        }
        private String getFileName(String input){
            int fIndex = input.lastIndexOf("\\");
            if (fIndex == -1) {
                fIndex = input.lastIndexOf("/");
                if (fIndex == -1) {
                    return input;
                }
            }
            input = input.substring(fIndex + 1);
            return input;
        }
        private String getFileNameByTime(String input){
            int index = input.indexOf(".");
            Date dt = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            return input.substring(0,index) + sdf.format(dt) + input.substring(index);
        }
    }

    說明

    這個類基本解決了上一貼的上一貼說的存在的bug和不足。主要做了如下修正。

    1. 用戶可以設定文件上傳的路徑,這里沒有用request對象的getRealPath方法來取得相對路徑,而是用了絕對路徑。是一個小敗筆。因為有時候用戶只是得到服務器的一個應用,而不知道整個服務器的路徑。但是既然getRealPath自己可以得到,用戶自己取得也可以。
    2. 在文件上傳處理的時候,預先進行了check,把一些可能出現的造成上傳失敗的情況拍查掉。避免該類出現不該出現的異常。
    3. 捕獲了IO異常,避免文件上傳的時候出現異常時程序的不友好表現
    4. 提供了方法返回form表單中其他參數的取得,模擬了HttpServletRequest對象的getParameter和getParameters方法(后面這個方法是叫這個名字么-_-b),取得Parameter的名稱的方法沒有提供,是個小缺陷。
    5. 提供了方法返回上傳的文件的件數和上傳的文件名,方便用戶作其他操作。

    現在介紹下JSP頁面中如何用這個類實現上傳。

    首先,要把這個類編譯后的class文件拷貝到WEB-INF/classes/目錄下。注意保持package的結構。

    在jsp頁面中引用這個類

    <%@page import="com.vogoal.util.JspFileUpload"%>

    <%
        //初始化
        JspFileUpload jfu = new JspFileUpload();
        //設定request對象
        jfu.setRequest(request);
        //設定上傳的文件路徑
        jfu.setUploadPath("C:\\");
        //上傳處理
        int rtn = jfu.process();
        //取得form中其他input控件參數的值
        String username = jfu.getParameter("username");
        //如果對應同一個參數有多個input控件,返回數組
        String[] usernameArr = jfu.getParameters("username");
        //取得上傳的文件的名字
        String[] fileArr = jfu.getUpdFileNames();
        //取得上傳文件的個數,這個方法有點雞肋
        int fileNumber = jfu.getUpdFileSize();
    //下面的是測試輸出的代碼。
    //       out.println("parameter:" + username);
    //       out.println("parameter size:" + usernameArr.length);
    //       out.println("fileArr size:" + fileArr.length);
    //       if (fileArr.length > 0)
    //              out.println("fileArr 0:" + fileArr[0]);
    %>

    使用的時候的注意事項

    1. 一定要設定request對象。
    2. 一定要設定正確的上傳路徑。
    3. 執行完了之后才可以得到其他參數,因為執行了之后這些參數才被分析。

    1,2兩點如果沒有做到的話,process方法執行的時候匯報錯。

    各個用戶可用的方法及說明

    設定requet對象。
    public void setRequest(HttpServletRequest request)

    設定文件上傳的路徑。
    public void setUploadPath(String path)

    文件上傳處理主程序。
    @return int 操作結果 0 文件操作成功;1 request對象不存在。 2 沒有設定文件保存路徑或者文件保存路徑不正確;3
             沒有設定正確的enctype;4 文件操作異常。
    public int process()

    根據name取得form表單中其他傳遞的參數的值(多個的話返回其中一個)
    public String getParameter(String name)

    根據name取得form表單中其他傳遞的參數的值(返回數組,可有多個)
    public String[] getParameters(String name)

    取得上傳成功文件的個數
    public int getUpdFileSize()

    取得上傳的文件名對應的數組。
    public String[] getUpdFileNames()

    注意process方法地返回值,在不是0的情況下操作失敗。

    以下提供測試類以及測試頁面(見附件):

    HelloPostFile.html
    HelloPostFile.jsp
    寫在jsp中的代碼的測試文件。
    HelloPostFileWithClass.html
    HelloPostFileWithClass.jsp
    抽出class后的測試文件。
    src在
    WEB-INF/src/
    class在
    WEB-INF/classes/

    另:
    由于這個文件被我在中文日文系統下編輯過,注釋出現亂碼,所以大部分都刪掉了,見諒。

    下載:WEB-INF.zip



    J-CN工作室
    www.j-cn.org
    posted on 2009-09-22 08:26 鐵猴 閱讀(228) 評論(0)  編輯  收藏 所屬分類: JAVA隨記
    主站蜘蛛池模板: 最近高清中文字幕免费| 99亚洲男女激情在线观看| 十八禁在线观看视频播放免费| 高清在线亚洲精品国产二区| 亚洲另类自拍丝袜第五页 | 中文字幕无码日韩专区免费| 国产亚洲精品激情都市| A级毛片成人网站免费看| 国产亚洲av片在线观看播放 | 免费人成网站在线观看10分钟| 亚洲自偷自拍另类图片二区| 91精品视频在线免费观看| 亚洲国产成人无码av在线播放| 无码人妻一区二区三区免费手机| 2020亚洲男人天堂精品| 男女啪啪永久免费观看网站| 羞羞网站免费观看| 亚洲一区二区三区在线播放| 特级做A爰片毛片免费看无码| 亚洲天天做日日做天天欢毛片 | 99re在线这里只有精品免费| 91午夜精品亚洲一区二区三区| 成人免费看黄20分钟| 日本高清免费中文在线看| 国产亚洲3p无码一区二区| 国产一卡二卡四卡免费| 亚洲AV无码AV吞精久久| 国产综合亚洲专区在线| 狼群影院在线观看免费观看直播 | 国产精品内射视频免费| 亚洲精品视频专区| 日韩a级毛片免费视频| 你是我的城池营垒免费看| 亚洲成人网在线观看| 免费在线观看理论片| 91在线老王精品免费播放| 亚洲乱码av中文一区二区| 亚洲成AV人片在线观看| 在线免费一区二区| 久久国产免费观看精品| 黑人粗长大战亚洲女2021国产精品成人免费视频|