成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

本周總結(jié)(文件上傳,下載,郵件)

luxixing / 3630人閱讀

摘要:文件上傳上傳對(duì)表單限制表單中需要添加文件表單項(xiàng)用戶名照片上傳上傳對(duì)限制文件上傳不能使用這個(gè)方法在表單為時(shí),它作廢了。

文件上傳 1.上傳對(duì)表單限制

method="post"

enctype="multipart/form-data"

表單中需要添加文件表單項(xiàng):

${msg }

用戶名;
照 片:
2.上傳對(duì)Servlet限制

文件上傳不能使用BaseServlet

request.getParametere("xxx");這個(gè)方法在表單為enctype="multipart/form-data"時(shí),它作廢了。它永遠(yuǎn)都返回null

ServletInputStream request.getInputStream();包含整個(gè)請(qǐng)求的體!

3.上傳三步

導(dǎo)入jar(commons-fileupload)

commons-fileupload.jar

commons-io.jar

相關(guān)類:

工廠:DiskFileItemFactory

解析器:ServletFileUpload

表單項(xiàng):FileItem

 1.創(chuàng)建工廠:DiskFileItemFactory factory = new DiskFileItemFactory();
 2.創(chuàng)建解析器:ServletFileUpload sfu = new ServletFileUpload(factory);
 3.使用解析器來(lái)解析request,得到FileItem集合:List fileItemList = sfu.parseRequest(request);

4.FileItem

boolean isFormField():是否為普通表單項(xiàng)!返回true為普通表單項(xiàng),如果為false即文件表單項(xiàng)!

String getFieldName():返回當(dāng)前表單項(xiàng)的名稱;

String getString(String charset):返回表單項(xiàng)的值;

String getName():返回上傳的文件名稱

long getSize():返回上傳文件的字節(jié)數(shù)

InputStream getInputStream():返回上傳文件對(duì)應(yīng)的輸入流

void write(File destFile):把上傳的文件內(nèi)容保存到指定的文件中。

String getContentType();獲取上傳的文件的類型

5.上傳的細(xì)節(jié)

保存到WEB-INF下!(目的是不讓瀏覽器直接訪問到)

有的瀏覽器上傳的文件名是絕對(duì)路徑,這需要切割

目錄打散

 哈希打散:  
     通過文件名稱得到int值,即調(diào)用hashCode()
     它int值轉(zhuǎn)換成16進(jìn)制0~9, A~F
     獲取16進(jìn)制的前兩位用來(lái)生成目錄,目錄為二層!例如:1B2C3D4E5F,/1/B/保存文件。

6.代碼
public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        /*
         * 上傳三步
         */
        // 工廠,設(shè)置緩存,超過20k,向目錄保存
        DiskFileItemFactory factory = new DiskFileItemFactory(20*1024, new File("F:/f/temp"));
        // 解析器
        ServletFileUpload sfu = new ServletFileUpload(factory);
        //sfu.setFileSizeMax(100 * 1024);//限制單個(gè)文件大小為100K
        //sfu.setSizeMax(1024 * 1024);//限制整個(gè)表單大小為1M
        
        // 解析,得到List
        try {
            List list = sfu.parseRequest(request);
            FileItem fi = list.get(1);
            
            /*
             * 1. 得到文件保存的路徑
             */
            String root = this.getServletContext().getRealPath("/WEB-INF/files/");
            /*
             * 2. 生成二層目錄
             *   1). 得到文件名稱
             *   2). 得到hashCode
             *   3). 轉(zhuǎn)發(fā)成16進(jìn)制
             *   4). 獲取前二個(gè)字符用來(lái)生成目錄
             */
            String filename = fi.getName();//獲取上傳的文件名稱
            /*
             * 處理文件名的絕對(duì)路徑問題
             */
            int index = filename.lastIndexOf("");
            if(index != -1) {
                filename = filename.substring(index+1);
            }
            /*
             * 給文件名稱添加uuid前綴,處理文件同名問題
             */
            String savename = CommonUtils.uuid() + "_" + filename;
            
            /*
             * 1. 得到hashCode
             */
            int hCode = filename.hashCode();
            String hex = Integer.toHexString(hCode);
            
            /*
             * 2. 獲取hex的前兩個(gè)字母,與root連接在一起,生成一個(gè)完整的路徑
             */
            File dirFile = new File(root, hex.charAt(0) + "/" + hex.charAt(1));
            
            /*
             * 3. 創(chuàng)建目錄鏈
             */
            dirFile.mkdirs();
            
            /*
             * 4. 創(chuàng)建目錄文件
             */
            File destFile = new File(dirFile, savename);
            
            /*
             * 5. 保存
             */
            fi.write(destFile);
            
            
        } catch (FileUploadException e) {
            if(e instanceof FileUploadBase.FileSizeLimitExceededException) {
                request.setAttribute("msg", "您上傳的文件超出了100KB!");
                request.getRequestDispatcher("/form.jsp").forward(request, response);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
文件下載 1.下載就是向客戶端響應(yīng)字節(jié)數(shù)據(jù)!
 把一個(gè)文件變成字節(jié)數(shù)組,使用response.getOutputStream()來(lái)各應(yīng)給瀏覽器?。?!
2.下載的要求

兩個(gè)頭一個(gè)流!

Content-Type:你傳遞給客戶端的文件是什么MIME類型,例如:image/pjpeg

 通過文件名稱調(diào)用ServletContext的getMimeType()方法,得到MIME類型!

Content-Disposition:它的默認(rèn)值為inline,表示在瀏覽器窗口中打開!attachment;filename=xxx

在filename=后面跟隨的是顯示在下載框中的文件名稱!

流:要下載的文件數(shù)據(jù)!

自己new一個(gè)輸入流即可!

3.代碼
@Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        /*
         * 兩個(gè)頭一個(gè)流
         * 1. Content-Type
         * 2. Content-Disposition
         * 3. 流:下載文件的數(shù)據(jù)
         */
        String filename = "F:/清白之年.mp3";
        
        // 為了使下載框中顯示中文文件名稱不出亂碼!
        String framename = filenameEncoding("清白之年.mp3", req);
        
        String contentType = this.getServletContext()
                .getMimeType(filename);//通過文件名稱獲取MIME類型
        String contentDisposition = "attachment;filename=" + framename;
        // 一個(gè)流
        FileInputStream input = new FileInputStream(filename);
        
        //設(shè)置頭
        resp.setHeader("Content-Type", contentType);
        resp.setHeader("Content-Disposition", contentDisposition);
        
        // 獲取綁定了響應(yīng)端的流
        ServletOutputStream output = resp.getOutputStream();
        
        IOUtils.copy(input, output);//把輸入流中的數(shù)據(jù)寫入到輸出流中。
        
        input.close();
    }
    
    // 用來(lái)對(duì)下載的文件名稱進(jìn)行編碼的?。ㄍㄓ梅桨福?    public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
        String agent = request.getHeader("User-Agent"); //獲取瀏覽器
        if (agent.contains("Firefox")) {
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?"
                    + base64Encoder.encode(filename.getBytes("utf-8"))
                    + "?=";
        } else if(agent.contains("MSIE")) {
            filename = URLEncoder.encode(filename, "utf-8");
        } else {
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
JavaMail

注意:一般郵箱需要開通POP3/SMTP/IMAP功能,發(fā)過去郵件很可能在垃圾箱里面

1.導(dǎo)入jar

mail.jar
activation.jar

2.主要類

javax.mail.Session
javax.mail.internet.MimeMessage
javax.mail.Transport

3.代碼

無(wú)附件

@Test
    public void fun1() throws Exception {
        /*
         * 1. 得到session
         */
        Properties props = new Properties();
        props.setProperty("mail.host", "smtp.163.com");
        props.setProperty("mail.smtp.auth", "true");
        
        Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("itcast_cxf", "itcast");//賬號(hào)密碼
            }
        };
        
        Session session = Session.getInstance(props, auth);
        
        /*
         * 2. 創(chuàng)建MimeMessage
         */
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress("[email protected]"));//設(shè)置發(fā)件人
        msg.setRecipients(RecipientType.TO, "[email protected]");//設(shè)置收件人
        //msg.setRecipients(RecipientType.CC, "[email protected]");//設(shè)置抄送
        //msg.setRecipients(RecipientType.BCC, "[email protected]");//設(shè)置暗送
        
        msg.setSubject("這是來(lái)自ITCAST的測(cè)試郵件");
        msg.setContent("這就是一封垃圾郵件!", "text/html;charset=utf-8");
        
        /*
         * 3. 發(fā)
         */
        Transport.send(msg);
    }

有附件

@Test
    public void fun2() throws Exception {
        /*
         * 1. 得到session
         */
        Properties props = new Properties();
        props.setProperty("mail.host", "smtp.163.com");
        props.setProperty("mail.smtp.auth", "true");
        
        Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("itcast_cxf", "itcast");
            }
        };
        
        Session session = Session.getInstance(props, auth);
        
        /*
         * 2. 創(chuàng)建MimeMessage
         */
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress("[email protected]"));//設(shè)置發(fā)件人
        msg.setRecipients(RecipientType.TO, "[email protected]");//設(shè)置收件人
        
        msg.setSubject("這是來(lái)自ITCAST的測(cè)試郵件有附件");
        
        /*
         * 當(dāng)發(fā)送包含附件的郵件時(shí),郵件體就為多部件形式!
         * 1. 創(chuàng)建一個(gè)多部件的部件內(nèi)容!MimeMultipart
         *   MimeMultipart就是一個(gè)集合,用來(lái)裝載多個(gè)主體部件!
         * 2. 我們需要?jiǎng)?chuàng)建兩個(gè)主體部件,一個(gè)是文本內(nèi)容的,另一個(gè)是附件的。
         *   主體部件叫MimeBodyPart
         * 3. 把MimeMultipart設(shè)置給MimeMessage的內(nèi)容!
         */
        MimeMultipart list = new MimeMultipart();//創(chuàng)建多部分內(nèi)容
        
        // 創(chuàng)建MimeBodyPart
        MimeBodyPart part1 = new MimeBodyPart();
        // 設(shè)置主體部件的內(nèi)容
        part1.setContent("這是一封包含附件的垃圾郵件", "text/html;charset=utf-8");
        // 把主體部件添加到集合中
        list.addBodyPart(part1);
        
        
        // 創(chuàng)建MimeBodyPart
        MimeBodyPart part2 = new MimeBodyPart();
        part2.attachFile(new File("F:/f/白冰.jpg"));//設(shè)置附件的內(nèi)容
        part2.setFileName(MimeUtility.encodeText("大美女.jpg"));//設(shè)置顯示的文件名稱,其中encodeText用來(lái)處理中文亂碼問題
        list.addBodyPart(part2);
        
        msg.setContent(list);//把它設(shè)置給郵件作為郵件的內(nèi)容。
        
        /*
         * 3. 發(fā)
         */
        Transport.send(msg);        
    }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74232.html

相關(guān)文章

  • Nextcloud個(gè)人云存儲(chǔ)絕佳選擇:一鍵自動(dòng)安裝方法和云盤使用體驗(yàn)

    搭建個(gè)人云存儲(chǔ)一般會(huì)想到ownCloud,堪稱是自建云存儲(chǔ)服務(wù)的經(jīng)典。而Nextcloud是ownCloud原開發(fā)團(tuán)隊(duì)打造的號(hào)稱是下一代存儲(chǔ)。初一看覺得口氣不小,剛推出來(lái)就重新定義了Cloud,真正試用過后就由衷地贊同這個(gè)Nextcloud:它是個(gè)人云存儲(chǔ)服務(wù)的絕佳選擇。 與ownCloud相比,Nextcloud的功能絲毫沒有減弱,甚至由于可以安裝云存儲(chǔ)服務(wù)應(yīng)用,自制性更強(qiáng),也更符合用戶的...

    Shisui 評(píng)論0 收藏0
  • 【趣味連載】攻城獅上傳視頻與普通人上傳視頻:序

    摘要:還有就是,我拿到的第一手?jǐn)?shù)據(jù),也不是什么結(jié)構(gòu)化數(shù)據(jù),而是一個(gè)表格,和一個(gè)分散在多個(gè)文件夾下的視頻資源。原來(lái)只有約個(gè)視頻,都是交給普通人上傳的。一生成結(jié)構(gòu)化數(shù)據(jù)講述的是,數(shù)據(jù)如何從普通的文檔數(shù)據(jù),變成最終可被程序化處理的過程。 前言 我想寫一個(gè)簡(jiǎn)單的系列文章。主題很簡(jiǎn)單,就是記錄下面對(duì)上傳視頻需求時(shí),攻城獅和普通人(泛指所有非技術(shù)人員)的一些區(qū)別。當(dāng)然,從需求分析到最終完整實(shí)現(xiàn),每個(gè)步驟...

    jackwang 評(píng)論0 收藏0
  • 【趣味連載】攻城獅上傳視頻與普通人上傳視頻:序

    摘要:還有就是,我拿到的第一手?jǐn)?shù)據(jù),也不是什么結(jié)構(gòu)化數(shù)據(jù),而是一個(gè)表格,和一個(gè)分散在多個(gè)文件夾下的視頻資源。原來(lái)只有約個(gè)視頻,都是交給普通人上傳的。一生成結(jié)構(gòu)化數(shù)據(jù)講述的是,數(shù)據(jù)如何從普通的文檔數(shù)據(jù),變成最終可被程序化處理的過程。 前言 我想寫一個(gè)簡(jiǎn)單的系列文章。主題很簡(jiǎn)單,就是記錄下面對(duì)上傳視頻需求時(shí),攻城獅和普通人(泛指所有非技術(shù)人員)的一些區(qū)別。當(dāng)然,從需求分析到最終完整實(shí)現(xiàn),每個(gè)步驟...

    Towers 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<