日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Javaweb学习笔记——(二十二)——————文件上传、下载、Javamail

發布時間:2024/1/17 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javaweb学习笔记——(二十二)——————文件上传、下载、Javamail 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?文件上傳概述
??? ?1.文件上傳的作用
??? ??? ?例如網絡硬盤,就是用來上傳下載文件的。
??? ??? ?在網絡瀏覽器中,時常需要上傳照片

??? ?2.文件上傳對頁面的要求
??? ??? ?上傳文件的要求比較多。需要記住
??? ??? ??? ?1.必須使用表單,而且不能是超鏈接。
??? ??? ??? ?2.表單的method必須是POST,不能是GET;
??? ??? ??? ?3.表單的enctype必須是meltipart/form-data
??? ??? ??? ?4.在表單中添加file表單字段,即<input type="file".../>

?? ??? ? ?? ?<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data">
?? ??? ? ? ??? ?用戶名:<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>

?? ?3.比對文件上傳表單和普通文本表單的區別
?? ??? ?通過httpWatch查看“文件上傳表單”和“普通文本表單”的區別
?? ??? ??? ?*文件上傳表單是enctype="multipart/form-data",表示多部件表單數據;
?? ??? ??? ?*普通文件表單可以不設置enctype屬性:
?? ??? ??? ??? ?**當method="post"時,enctype的默認值為application/x-www-form-urlencoded,表示使用url編碼正文;
?? ??? ??? ??? ?**當method="get"時,enctype的默認值為null,沒有正文,所以就不需要enctype了。

?? ??? ?對普通文本表單的測試:
?? ??? ??? ?<form action="${pageContext.request.contextPath }/FileUploadServlet" 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>

?? ??? ??? ?通過httpWatch測試,查看表單的請求數據正文,我們發現請求中只有文件名稱,而沒有文件內容。也就是說,當表單的enctype不是multipart/form
?? ??? ??? ?-data時,請求中不包含文件內容,而只用文件的民粹,這說明普通文本表單中input:file和input:text沒有什么區別。

?? ??? ?對文件上傳表單的測試
?? ??? ??? ? ? ?<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data">
?? ??? ??? ? ? ??? ?用戶名:<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>
?? ??? ??? ?通過httpWatch測試,查看表單的請求數據正文部分,發現正文部位是由多個部件組成,每個部件對應一個表單字段,每個部件都有自己的頭信息。頭信息下面是空行,空行下面是字段是正文部分。多個部件之間使用隨機生成的分割線隔開。
?? ??? ??? ?文本字段的頭信息中只包含一條頭信息,即Content-Disposition,這個頭信息的值有兩部分,第一部分是固定的,即form-data,第二部分為字段的名稱。在空行后面就是正文部分了,正文部分就是在文本框中填寫的內容。
?? ??? ??? ?文件字段的頭信息中包含了頭信息,Content-Disposition和Content-Type。Content-Disposition中多出了一個filename,它指定的是上傳的文件名稱。而Content-Type指定的是上傳文件的類型。文件字段的正文部分就是文件的內容。

?? ??? ??? ?請注意,因為我們上傳的文件都是普通文本文件,即txt文件,所以在httpWatch中是可以正常顯示的,如果上傳的是exe、mp3等文件,那么在httpWatch中看到的就是亂碼了。

?? ?4.文件上傳對Servlet的要求
?? ??? ?當提交的表單是文件上傳表單時,那么對Servlet也是有要求的。首先我們要肯定一點,文件上傳表單的數據也是被封裝到request對象中的。
?? ??? ?request.getParameter(String)方法獲取指定的表單字段字符內容,單文件上傳表單已經不再是字符內容,而是字節內容,所以失效。

?? ??? ?這時可以使用request的getInputStream()方法獲取ServletInputStream對象,它是InputStream的子類,這個ServletInputStream對象對應整個表單的正文部分(從第一個分隔線開始,到最后),這說明我們需要的解析流中的數據。當然解析它是很麻煩的一件事情,而Apache已經幫我們提供了了解它的工具:commons-fileupload。

?? ??? ?可以嘗試吧request.getInputStream()這個流中的內容打印出來,再對比httpWatch中請求數據。
?? ??? ??? ?public void doPost(HttpServletRequest request, HttpServletResponse response)
?? ??? ??? ??? ?throws ServletException, IOException {
?? ??? ??? ??? ?InputStream in = request.getInputStream();
?? ??? ??? ??? ?String s = IOUtils.toString(in);
?? ??? ??? ??? ?System.out.println(s);
?? ??? ??? ?}

?? ??? ??? ?-----------------------------7ddd3370ab2
?? ??? ??? ?Content-Disposition: form-data; name="username"

?? ??? ??? ?hello
?? ??? ??? ?-----------------------------7ddd3370ab2
?? ??? ??? ?Content-Disposition: form-data; name="file1"; filename="a.txt"
?? ??? ??? ?Content-Type: text/plain

?? ??? ??? ?aaa
?? ??? ??? ?-----------------------------7ddd3370ab2
?? ??? ??? ?Content-Disposition: form-data; name="file2"; filename="b.txt"
?? ??? ??? ?Content-Type: text/plain

?? ??? ??? ?bbb
?? ??? ??? ?-----------------------------7ddd3370ab2--


?? ?Commons-fileupload
?? ??? ?為什么使用filleupload:
?? ??? ??? ?上傳文件的要求比較多,需要記一下:
?? ??? ??? ??? ?*必須是POST表單;
?? ??? ??? ??? ?*表單的enctype必須是multipart/form-data;
?? ??? ??? ??? ?*在表單中添加file表單字段,即<input type="file" .../>

?? ??? ?Servlet的要求:
?? ??? ??? ?*不能再使用request.getParameter()來獲取表單數據;
?? ??? ??? ?*可以使用request.getInputStream()得到所有的表單數據,而不是一個表單項的數據;
?? ??? ??? ?*這說明不適用fileupload,我們需要自己來對request.getInputStream()的內容進行解析。

?? ??? ?1.fileupload概述
?? ??? ??? ?fileupload是由apache的commons組件提供的上傳組件。它最主要的工作就是幫我們解析request.getInputStream()。
?? ??? ??? ?fileupload組件需要的jar包有:
?? ??? ??? ??? ?*commons-fileupload.jar,核心包;
?? ??? ??? ??? ?*commons-io.jar,依賴包。

?? ??? ?2.fileupload簡單應用
?? ??? ??? ?fileupload的核心類有:DiskFileItemFactory、ServletFileUpload、FileItem。
?? ??? ??? ?使員工fileupload組件的步驟如下:
?? ??? ??? ??? ?1.創建工廠類DiskFileItemFactory對象:DiskFileItemFactory factory = new DiskFileItemFactory()
?? ??? ??? ??? ?2.使用工廠創建解析器對象:ServetFileUpload fileUpload = new ServletFileUpload(factory);
?? ??? ??? ??? ?3.使用解析器來解析request對象:List<FileItem> list = fileUpload.parseRquest(request);

?? ??? ??? ?隆重介紹FileItem類,它才是我們最終想要的結果。一個FileItem對象對應一個表單項(表單字段)。一個表單中存在文件字段和普通字段,可以使用FileItem類的isFormField()方法來判斷表單字段是否為普通字段,如果不是普通字段,那么就是文件字段了。
?? ??? ??? ??? ?*String getName():獲取文件字段的文件名稱;
?? ??? ??? ??? ?*String getString():獲取字段的內容,如果是文件字段,那么獲取的是文件內容,當然上傳的文件必須是文本文件;
?? ??? ??? ??? ?*String getFieldName():獲取字段名稱,例如:<input type="text" name="username"/>,返回的是username;
?? ??? ??? ??? ?*String getContentType():獲取上傳的文件的類型,例如:text/plain。
?? ??? ??? ??? ?*int getSize():獲取上傳文件的大小;
?? ??? ??? ??? ?*boolean isFormField():判斷當前表單字段是否為普通文本字段,如果返回false,說明是文件字段;
?? ??? ??? ??? ?*InputStream getInputStream():獲取上傳文件對應的輸入流;
?? ??? ??? ??? ?*void write(File):把上傳的文件保存到指定文件中。

?? ??? ?3.簡單上傳示例
?? ??? ??? ?寫一個簡單的上傳示例:
?? ??? ??? ??? ?*表單包含一個用戶名字段,已經一個文件字段;
?? ??? ??? ??? ?*Servlet保存上傳的文件到uploads目錄,顯示用戶名,文件名,文件大小,文件類型。

?? ??? ??? ?第一步:
?? ??? ??? ??? ?完成index.jsp,只需要一個表單。注意表單必須是post的,而且enctype必須是mulitpart/form-data的。
?? ??? ??? ??? ? ? ?<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data">
?? ??? ??? ??? ? ? ??? ?用戶名:<input type="text" name="username"/><br/>
?? ??? ??? ??? ? ? ??? ?文件1:<input type="file" name="file1"/><br/>
?? ??? ??? ??? ? ? ??? ?<input type="submit" value="提交"/>
?? ??? ??? ??? ? ? ?</form>

?? ??? ??? ?第二步:
?? ??? ??? ??? ?完成FileUploadServlet
?? ??? ??? ??? ??? ??? ?public void doPost(HttpServletRequest request, HttpServletResponse response)
?? ??? ??? ??? ??? ??? ??? ??? ?throws ServletException, IOException {
?? ??? ??? ??? ??? ??? ??? ?// 因為要使用response打印,所以設置其編碼
?? ??? ??? ??? ??? ??? ??? ?response.setContentType("text/html;charset=utf-8");
?? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ?// 創建工廠
?? ??? ??? ??? ??? ??? ??? ?DiskFileItemFactory dfif = new DiskFileItemFactory();
?? ??? ??? ??? ??? ??? ??? ?// 使用工廠創建解析器對象
?? ??? ??? ??? ??? ??? ??? ?ServletFileUpload fileUpload = new ServletFileUpload(dfif);
?? ??? ??? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ??? ??? ?// 使用解析器對象解析request,得到FileItem列表
?? ??? ??? ??? ??? ??? ??? ??? ?List<FileItem> list = fileUpload.parseRequest(request);
?? ??? ??? ??? ??? ??? ??? ??? ?// 遍歷所有表單項
?? ??? ??? ??? ??? ??? ??? ??? ?for(FileItem fileItem : list) {
?? ??? ??? ??? ??? ??? ??? ??? ??? ?// 如果當前表單項為普通表單項
?? ??? ??? ??? ??? ??? ??? ??? ??? ?if(fileItem.isFormField()) {
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 獲取當前表單項的字段名稱
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?String fieldName = fileItem.getFieldName();
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 如果當前表單項的字段名為username
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?if(fieldName.equals("username")) {
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 打印當前表單項的內容,即用戶在username表單項中輸入的內容
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?response.getWriter().print("用戶名:" + fileItem.getString() + "<br/>");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ??? ?} else {//如果當前表單項不是普通表單項,說明就是文件字段
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?String name = fileItem.getName();//獲取上傳文件的名稱
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 如果上傳的文件名稱為空,即沒有指定上傳文件
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?if(name == null || name.isEmpty()) {
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?continue;
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 獲取真實路徑,對應${項目目錄}/uploads,當然,這個目錄必須存在
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?String savepath = this.getServletContext().getRealPath("/uploads");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 通過uploads目錄和文件名稱來創建File對象
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?File file = new File(savepath, name);
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 把上傳文件保存到指定位置
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?fileItem.write(file);
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 打印上傳文件的名稱
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?response.getWriter().print("上傳文件名:" + name + "<br/>");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 打印上傳文件的大小
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?response.getWriter().print("上傳文件大小:" + fileItem.getSize() + "<br/>");
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 打印上傳文件的類型
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?response.getWriter().print("上傳文件類型:" + fileItem.getContentType() + "<br/>");
?? ??? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ?} catch (Exception e) {
?? ??? ??? ??? ??? ??? ??? ??? ?throw new ServletException(e);
?? ??? ??? ??? ??? ??? ??? ?}?
?? ??? ??? ??? ??? ??? ?}


?? ?文件上傳之細節
?? ??? ?1.把上傳的文件放到WEB-INF目錄下
?? ??? ??? ?如果沒有把用戶上傳的文件存放到WEB-INF目錄下,那么用戶就可以通過瀏覽器直接訪問上傳的文件,這是非常危險的。
?? ??? ??? ?假如說用戶上傳了一個a.jsp文件,然后用戶在通過瀏覽器去訪問這個a.jsp文件,那么就會執行a.jsp中的內容,如果在a.jsp中有如下語句:Runtime.getRuntime().exec("shutdown -s -t 1");,那么系統立馬關機

?? ??? ??? ?通常我們會在WEB-INF目錄下創建一個uploads目錄來存放上傳的文件,而在Servlet中找到這個目錄需要使用ServletoContext的getRealPath(String)方法,例如在我的upload1項目中有如下語句:
?? ??? ??? ??? ?ServletContext servletContext = this.getServletContext();
?? ??? ??? ??? ?String savePath = servletContext.getRealPath("/WEB-INF/uploads");
?? ??? ??? ??? ?其中savePath為:F:\tomcat6_1\webapps\upload1\WEB-INF\uploads

?? ??? ?2.文件名稱(完整路徑、文件名稱)
?? ??? ??? ?上傳文件名稱可能是完整路徑:
?? ??? ??? ??? ?IE6獲取的上傳文件名稱是完整路徑,而其他瀏覽器獲取的上傳文件名稱只是文件名稱而已。瀏覽器差異的問題我們還是需要處理一下。
?? ??? ??? ??? ??? ?String name = file1FileItem.getName();
?? ??? ??? ??? ??? ?response.getWriter().print(name);

?? ??? ??? ??? ?使用不同瀏覽器測試,其中IE6就會返回上傳文件的完整路徑,不知道IE6怎么操作,這就給我們帶來了很大的麻煩,就是需要處理一下這個問題。
?? ??? ??? ??? ?處理這一問題也很簡單,無論是否為完整路徑,我們都去截取最后一個“\\”后面的內容就可以了。
?? ??? ??? ??? ??? ?String name = file1FileItem.getName();
?? ??? ??? ??? ??? ?int lastIndex = name.lastIndexOf("\\");//獲取最后一個“\”的位置
?? ??? ??? ??? ??? ?if(lastIndex != -1) {//注意,如果不是完整路徑,那么就不會有“\”的存在。
?? ??? ??? ??? ??? ??? ?name = name.substring(lastIndex + 1);//獲取文件名稱
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?response.getWriter().print(name);

?? ??? ?3.中文亂碼問題
?? ??? ??? ?上傳文件名稱包含中文:
?? ??? ??? ??? ?當上傳文件名稱中包含中文:
?? ??? ??? ??? ??? ?當上傳的誰的名稱中包含中文時,需要設置編碼,commons-fileupload組件為我們提供了兩種設置編碼的方式:
?? ??? ??? ??? ??? ??? ?*request.setCharacterEncoding(Strnig):這種方式是我們最為熟悉的一種;
?? ??? ??? ??? ??? ??? ?*fileUpload.setHeaderEncoding(String):這種方式的優先級高于前一種。

?? ??? ??? ??? ?上傳文件的文件內容包含中文:
?? ??? ??? ??? ??? ?通常我們會把用戶上傳的文件保存到uploads目錄下,但是如果用戶上傳了同名文件?,這回出現覆蓋現象。處理這一問題的手段是使用UUID生產唯一名稱,然后再使用“_”連接文件上傳的原始名稱。
?? ??? ??? ??? ??? ?例如用戶上傳的文件是“123.jpg”,在通過處理后,文件名稱為“891b3881395f4175b969256a3f7b6e10_123.jpg”,這種手段不會使文件丟失擴展名,并且因為UUID的唯一性,上傳的文件同名,但是在服務器端是不會出現同名問題的。
?? ??? ??? ??? ??? ??? ?public void doPost(HttpServletRequest request, HttpServletResponse response)
?? ??? ??? ??? ??? ??? ??? ??? ?throws ServletException, IOException {
?? ??? ??? ??? ??? ??? ??? ?request.setCharacterEncoding("utf-8");
?? ??? ??? ??? ??? ??? ??? ?DiskFileItemFactory dfif = new DiskFileItemFactory();
?? ??? ??? ??? ??? ??? ??? ?ServletFileUpload fileUpload = new ServletFileUpload(dfif);
?? ??? ??? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ??? ??? ?List<FileItem> list = fileUpload.parseRequest(request);
?? ??? ??? ??? ??? ??? ??? ??? ?//獲取第二個表單項,因為第一個表單項是username,第二個才是file表單項
?? ??? ??? ??? ??? ??? ??? ??? ?FileItem fileItem = list.get(1);
?? ??? ??? ??? ??? ??? ??? ??? ?String name = fileItem.getName();//獲取文件名稱
?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ??? ?// 如果客戶端使用的是IE6,那么需要從完整路徑中獲取文件名稱
?? ??? ??? ??? ??? ??? ??? ??? ?int lastIndex = name.lastIndexOf("\\");
?? ??? ??? ??? ??? ??? ??? ??? ?if(lastIndex != -1) {
?? ??? ??? ??? ??? ??? ??? ??? ??? ?name = name.substring(lastIndex + 1);
?? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ??? ?// 獲取上傳文件的保存目錄
?? ??? ??? ??? ??? ??? ??? ??? ?String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
?? ??? ??? ??? ??? ??? ??? ??? ?String uuid = CommonUtils.uuid();//生成uuid
?? ??? ??? ??? ??? ??? ??? ??? ?String filename = uuid + "_" + name;//新的文件名稱為uuid + 下劃線 + 原始名稱
?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ??? ?//創建file對象,下面會把上傳文件保存到這個file指定的路徑
?? ??? ??? ??? ??? ??? ??? ??? ?//savepath,即上傳文件的保存目錄
?? ??? ??? ??? ??? ??? ??? ??? ?//filename,文件名稱
?? ??? ??? ??? ??? ??? ??? ??? ?File file = new File(savepath, filename);
?? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ??? ?// 保存文件
?? ??? ??? ??? ??? ??? ??? ??? ?fileItem.write(file);
?? ??? ??? ??? ??? ??? ??? ?} catch (Exception e) {
?? ??? ??? ??? ??? ??? ??? ??? ?throw new ServletException(e);
?? ??? ??? ??? ??? ??? ??? ?}?
?? ??? ??? ??? ??? ??? ?}

?? ??? ?5.一個目錄不能存放過多的文件(存放目錄打散)
?? ??? ??? ?一個目錄下不應該存放過多的文件,一般一個目錄下存放1000個文件就是上限了,如果在多,那么打開目錄的時候就會出現卡頓現象。
?? ??? ??? ?也就是說,我們需要把上傳的文件放到不同的目錄中。但是也不能為每個上傳的文件設置一個目錄,這種方式會導致目錄過多。所以應該采用某種算法進行“打散”操作。
?? ??? ??? ?打散的方式有很多,例如使用日期進行打散,每天生成一個目錄,也可以使用文件名的首字母來生成目錄,相同首字母的文件放到同一目錄下。
?? ??? ??? ?日期打散算法:如果某一天上傳的文件過多,那么也會出現一個目錄文件過多的情況;
?? ??? ??? ?首字打散算法:如果文件名是中文的,因為中文過多,所有會導致目錄過多的現象。

?? ??? ??? ?這里我們使用hash算法進行打散操作:
?? ??? ??? ??? ?1.獲取文件名稱的hashCode、int hCode = name.hashCode();
?? ??? ??? ??? ?2.獲取hCode的第4位,然后轉換成16進制字符;
?? ??? ??? ??? ?3.獲取hCode的5~8位,然后轉換成16進制字符;
?? ??? ??? ??? ?4.使用這兩個16進制的字符生成目錄鏈。例如第4位字符為“5”

?? ??? ??? ?這種算法的好處是,在uploads目錄下最多生成16個目錄,而每個目錄下最多再生成16個目錄,即256個目錄,所有上傳的文件都放到這256個目錄下。如果每個目錄上限為1000個文件,那么一共可以有256000個文件。

?? ??? ??? ?例如上傳文件名稱為:新建 文本文檔.txt,那么把“新建 文本文檔.txt”的哈希碼獲取到,再獲取哈希碼的低4位,和5~8位。假如第4位為9,5~8位為1,那么文件的保存路徑為uploads/9/1/。
?? ??? ??? ??? ?int hCode = name.hashCode();//獲取文件名的hashCode
?? ??? ??? ??? ?//獲取hCode的低4位,并轉換成16進制字符串
?? ??? ??? ??? ?String dir1 = Integer.toHexString(hCode & 0xF);
?? ??? ??? ??? ?//獲取hCode的低5~8位,并轉換成16進制字符串
?? ??? ??? ??? ?String dir2 = Integer.toHexString(hCode >>> 4 & 0xF);
?? ??? ??? ??? ?//與文件保存目錄連接成完整路徑
?? ??? ??? ??? ?savepath = savepath + "/" + dir1 + "/" + dir2;
?? ??? ??? ??? ?//因為這個路徑可能不存在,所以創建成File對象,再創建目錄鏈,確保目錄在保存文件之前已經存在
?? ??? ??? ??? ?new File(savepath).mkdirs();

?? ??? ?6.上傳的單個文件的大小限制
?? ??? ??? ?限制上傳文件的大小很簡單,ServletFileUpload類的setFileSizeMax(long)就可以了。參數就是上傳文件的上限字節數,例如servletFileUpload.setFileSizeMax(1024*10)表示上限為10kb。
?? ??? ??? ?一旦上傳的文件超出了上限,那么就會拋出FileUploadBase.FileSizeLimitExceededException異常。我們可以在Servlet中獲取這個異常,然后向頁面輸出“上傳的文件超出限制”。
?? ??? ??? ??? ??? ?public void doPost(HttpServletRequest request, HttpServletResponse response)
?? ??? ??? ??? ??? ??? ??? ?throws ServletException, IOException {
?? ??? ??? ??? ??? ??? ?request.setCharacterEncoding("utf-8");
?? ??? ??? ??? ??? ??? ?DiskFileItemFactory dfif = new DiskFileItemFactory();
?? ??? ??? ??? ??? ??? ?ServletFileUpload fileUpload = new ServletFileUpload(dfif);
?? ??? ??? ??? ??? ??? ?// 設置上傳的單個文件的上限為10KB
?? ??? ??? ??? ??? ??? ?fileUpload.setFileSizeMax(1024 * 10);
?? ??? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ??? ?List<FileItem> list = fileUpload.parseRequest(request);
?? ??? ??? ??? ??? ??? ??? ?//獲取第二個表單項,因為第一個表單項是username,第二個才是file表單項
?? ??? ??? ??? ??? ??? ??? ?FileItem fileItem = list.get(1);
?? ??? ??? ??? ??? ??? ??? ?String name = fileItem.getName();//獲取文件名稱
?? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ?// 如果客戶端使用的是IE6,那么需要從完整路徑中獲取文件名稱
?? ??? ??? ??? ??? ??? ??? ?int lastIndex = name.lastIndexOf("\\");
?? ??? ??? ??? ??? ??? ??? ?if(lastIndex != -1) {
?? ??? ??? ??? ??? ??? ??? ??? ?name = name.substring(lastIndex + 1);
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ?// 獲取上傳文件的保存目錄
?? ??? ??? ??? ??? ??? ??? ?String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
?? ??? ??? ??? ??? ??? ??? ?String uuid = CommonUtils.uuid();//生成uuid
?? ??? ??? ??? ??? ??? ??? ?String filename = uuid + "_" + name;//新的文件名稱為uuid + 下劃線 + 原始名稱
?? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ?int hCode = name.hashCode();//獲取文件名的hashCode
?? ??? ??? ??? ??? ??? ??? ?//獲取hCode的低4位,并轉換成16進制字符串
?? ??? ??? ??? ??? ??? ??? ?String dir1 = Integer.toHexString(hCode & 0xF);
?? ??? ??? ??? ??? ??? ??? ?//獲取hCode的低5~8位,并轉換成16進制字符串
?? ??? ??? ??? ??? ??? ??? ?String dir2 = Integer.toHexString(hCode >>> 4 & 0xF);
?? ??? ??? ??? ??? ??? ??? ?//與文件保存目錄連接成完整路徑
?? ??? ??? ??? ??? ??? ??? ?savepath = savepath + "/" + dir1 + "/" + dir2;
?? ??? ??? ??? ??? ??? ??? ?//因為這個路徑可能不存在,所以創建成File對象,再創建目錄鏈,確保目錄在保存文件之前已經存在
?? ??? ??? ??? ??? ??? ??? ?new File(savepath).mkdirs();
?? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ?//創建file對象,下面會把上傳文件保存到這個file指定的路徑
?? ??? ??? ??? ??? ??? ??? ?//savepath,即上傳文件的保存目錄
?? ??? ??? ??? ??? ??? ??? ?//filename,文件名稱
?? ??? ??? ??? ??? ??? ??? ?File file = new File(savepath, filename);
?? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ??? ?// 保存文件
?? ??? ??? ??? ??? ??? ??? ?fileItem.write(file);
?? ??? ??? ??? ??? ??? ?} catch (Exception e) {
?? ??? ??? ??? ??? ??? ??? ?// 判斷拋出的異常的類型是否為FileUploadBase.FileSizeLimitExceededException
?? ??? ??? ??? ??? ??? ??? ?// 如果是,說明上傳文件時超出了限制。
?? ??? ??? ??? ??? ??? ??? ?if(e instanceof FileUploadBase.FileSizeLimitExceededException) {
?? ??? ??? ??? ??? ??? ??? ??? ?// 在request中保存錯誤信息
?? ??? ??? ??? ??? ??? ??? ??? ?request.setAttribute("msg", "上傳失敗!上傳的文件超出了10KB!");
?? ??? ??? ??? ??? ??? ??? ??? ?// 轉發到index.jsp頁面中!在index.jsp頁面中需要使用${msg}來顯示錯誤信息
?? ??? ??? ??? ??? ??? ??? ??? ?request.getRequestDispatcher("/index.jsp").forward(request, response);
?? ??? ??? ??? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ?throw new ServletException(e);
?? ??? ??? ??? ??? ??? ?}?
?? ??? ??? ??? ??? ?}
?? ??? ?
?? ??? ?7.上傳文件的總大小限制
?? ??? ??? ?上傳文件的表單中可能允許上傳多個文件,例如:
?? ??? ??? ??? ?有時我們需要限制一個請求的大小。也就是說這個請求的最大字節數(所有表單項之和)實現這一功能也很簡單,只需要調用ServletFileUpload類的setSizeMax(long)方法即可。
?? ??? ??? ??? ?例如fileUpload.setSizeMax(1024*10),顯示整個請求的上限為10kb。當請求大小超出了10kb時,ServletFileUploa類的parseRequest()方法會拋出FileUploadBase.SizeLimitException異常。

?? ??? ?8.緩存大小與臨時目錄
?? ??? ??? ?一種現象:如果上傳一個藍光電影,先把電影保存到電影中,然后再通過內存copy到服務器硬盤上,那么你的內存能吃下嗎?
?? ??? ??? ?所以fileUpload組件不可能吧文件都保留到內存中,fileUpload會判斷文件大小是否超出10kb,如果是,那么就把文件保存到硬盤中,如果沒超過,那么就保存到內存中。
?? ??? ??? ?10kb是fileUpload的默認值,我們可以來設置它。
?? ??? ??? ?當文件保存到硬盤時,fileUpload是吧文件保存到系統臨時目錄,當然你也可以去設置臨時目錄。
?? ??? ??? ??? ?public void doPost(HttpServletRequest request, HttpServletResponse response)
?? ??? ??? ??? ??? ??? ?throws ServletException, IOException {
?? ??? ??? ??? ??? ?request.setCharacterEncoding("utf-8");
?? ??? ??? ??? ??? ?DiskFileItemFactory dfif = new DiskFileItemFactory(1024*20, new File("F:\\temp"));
?? ??? ??? ??? ??? ?ServletFileUpload fileUpload = new ServletFileUpload(dfif);
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ?List<FileItem> list = fileUpload.parseRequest(request);
?? ??? ??? ??? ??? ??? ?FileItem fileItem = list.get(1);
?? ??? ??? ??? ??? ??? ?String name = fileItem.getName();
?? ??? ??? ??? ??? ??? ?String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
?? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ??? ?// 保存文件
?? ??? ??? ??? ??? ??? ?fileItem.write(path(savepath, name));
?? ??? ??? ??? ??? ?} catch (Exception e) {
?? ??? ??? ??? ??? ??? ?throw new ServletException(e);
?? ??? ??? ??? ??? ?}?
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ??? ??? ??? ?private File path(String savepath, String filename) {
?? ??? ??? ??? ??? ?// 從完整路徑中獲取文件名稱
?? ??? ??? ??? ??? ?int lastIndex = filename.lastIndexOf("\\");
?? ??? ??? ??? ??? ?if(lastIndex != -1) {
?? ??? ??? ??? ??? ??? ?filename = filename.substring(lastIndex + 1);
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?// 通過文件名稱生成一級、二級目錄
?? ??? ??? ??? ??? ?int hCode = filename.hashCode();
?? ??? ??? ??? ??? ?String dir1 = Integer.toHexString(hCode & 0xF);
?? ??? ??? ??? ??? ?String dir2 = Integer.toHexString(hCode >>> 4 & 0xF);
?? ??? ??? ??? ??? ?savepath = savepath + "/" + dir1 + "/" + dir2;
?? ??? ??? ??? ??? ?// 創建目錄
?? ??? ??? ??? ??? ?new File(savepath).mkdirs();
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?// 給文件名稱添加uuid前綴
?? ??? ??? ??? ??? ?String uuid = CommonUtils.uuid();
?? ??? ??? ??? ??? ?filename = uuid + "_" + filename;
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?// 創建文件完成路徑
?? ??? ??? ??? ??? ?return new File(savepath, filename);
?? ??? ??? ??? ?}


文件下載
?? ?1.通過Servlet下載1
?? ??? ?被下載的資源必須放到WEB-INF目錄下,(只要用戶不能通過瀏覽器直接訪問就ok),然后通過Servlet完成下載,
?? ??? ?在jsp頁面中給出超鏈接,連接到DownloadServlet,并提供要下載的文件名稱。然后DownloadServlet獲取文件的真實路徑,然后把文件寫入到response.getOutputStream()流中。

?? ??? ?download.jsp
?? ??? ??? ? ?<body>
?? ??? ??? ? ? ?This is my JSP page. <br>
?? ??? ??? ? ? ?<a href="<c:url value='/DownloadServlet?path=a.avi'/>">a.avi</a><br/>
?? ??? ??? ? ? ?<a href="<c:url value='/DownloadServlet?path=a.jpg'/>">a.jpg</a><br/>
?? ??? ??? ? ? ?<a href="<c:url value='/DownloadServlet?path=a.txt'/>">a.txt</a><br/>
?? ??? ??? ? ?</body>

?? ??? ?DownloadServlet.java
?? ??? ??? ??? ?public void doGet(HttpServletRequest request, HttpServletResponse response)
?? ??? ??? ??? ??? ??? ?throws ServletException, IOException {
?? ??? ??? ??? ??? ?String filename = request.getParameter("path");
?? ??? ??? ??? ??? ?String filepath = this.getServletContext().getRealPath("/WEB-INF/uploads/" + filename);
?? ??? ??? ??? ??? ?File file = new File(filepath);
?? ??? ??? ??? ??? ?if(!file.exists()) {
?? ??? ??? ??? ??? ??? ?response.getWriter().print("您要下載的文件不存在!");
?? ??? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?IOUtils.copy(new FileInputStream(file), response.getOutputStream());
?? ??? ??? ??? ?}

?? ??? ?上面代碼有如下問題:
?? ??? ??? ?*可以下載a.avi,但是在下載框中的文件名稱為DownloadServlet;
?? ??? ??? ?*不能下載a.jpg和a.txt,而是在頁面中顯示他們。

?? ?2.通過Servlet下載2
?? ??? ?下面來處理上一例中的問題,讓下載框中可以顯示正確的文件名稱,已經可以下載a.jsp和a.txt文件。
?? ??? ?通過添加content-disposition頭來處理上面問題。當設置了content-disposition頭后,瀏覽器就會彈出下載框。
?? ??? ?而且還可以通過content-disposition頭來指定下載文件的名稱
?? ??? ??? ??? ?String filename = request.getParameter("path");
?? ??? ??? ??? ?String filepath = this.getServletContext().getRealPath("/WEB-INF/uploads/" + filename);
?? ??? ??? ??? ?File file = new File(filepath);
?? ??? ??? ??? ?if(!file.exists()) {
?? ??? ??? ??? ??? ?response.getWriter().print("您要下載的文件不存在!");
?? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?response.addHeader("content-disposition", "attachment;filename=" + filename);
?? ??? ??? ??? ?IOUtils.copy(new FileInputStream(file), response.getOutputStream());
?? ??? ??? ?雖然上面的代碼已經處理txt和jpg等文件的下載問題,并且也處理了下載框中顯示文件名稱的問題,但是如果下載的文件名稱是中文的,那么還是不行的。


?? ?3.通過Serlvet下載3
?? ??? ?下面是處理在下載框中顯示中文的問題
?? ??? ?其實這一問題很簡單,只需要通過URL來編碼中文即可。

?? ??? ??? ?download.jsp
?? ??? ??? ? ? ?<a href="<c:url value='/DownloadServlet?path=這個殺手不太冷.avi'/>">這個殺手不太冷.avi</a><br/>
?? ??? ??? ? ? ?<a href="<c:url value='/DownloadServlet?path=白冰.jpg'/>">白冰.jpg</a><br/>
?? ??? ??? ? ? ?<a href="<c:url value='/DownloadServlet?path=說明文檔.txt'/>">說明文檔.txt</a><br/>


?? ??? ??? ?DownloadServlet.java
?? ??? ??? ??? ?String filename = request.getParameter("path");
?? ??? ??? ??? ?// GET請求中,參數中包含中文需要自己動手來轉換。
?? ??? ??? ??? ?// 當然如果你使用了“全局編碼過濾器”,那么這里就不用處理了
?? ??? ??? ??? ?filename = new String(filename.getBytes("ISO-8859-1"), "UTF-8");
?? ??? ??? ??? ?
?? ??? ??? ??? ?String filepath = this.getServletContext().getRealPath("/WEB-INF/uploads/" + filename);
?? ??? ??? ??? ?File file = new File(filepath);
?? ??? ??? ??? ?if(!file.exists()) {
?? ??? ??? ??? ??? ?response.getWriter().print("您要下載的文件不存在!");
?? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?// 所有瀏覽器都會使用本地編碼,即中文操作系統使用GBK
?? ??? ??? ??? ?// 瀏覽器收到這個文件名后,會使用iso-8859-1來解碼
?? ??? ??? ??? ?filename = new String(filename.getBytes("GBK"), "ISO-8859-1");
?? ??? ??? ??? ?response.addHeader("content-disposition", "attachment;filename=" + filename);
?? ??? ??? ??? ?IOUtils.copy(new FileInputStream(file), response.getOutputStream());


JavaMail
?? ?*郵件協議
?? ?*teinet訪問郵件服務器
?? ?*JavaMail

?? ?郵件協議
?? ??? ?1.收發郵件
?? ??? ??? ?發郵件是從客戶端吧郵件發送到郵件服務器,收郵件是吧郵件服務器的郵件下載到客戶端。
?? ??? ??? ?在163、126、QQ、sohu、sina等網站注冊的Email賬戶,其實就是在郵件服務器中注冊的。這些網站都有自己的郵件服務器。

?? ??? ?2.郵件協議概述
?? ??? ??? ?與Http協議相同,收發郵件也是需要有傳輸協議的。
?? ??? ??? ??? ?*SMTP:(Simple Mail Transfer Protocol,簡單郵件傳輸協議)發郵件協議;
?? ??? ??? ??? ?*POP3:(Post Office Protocol Version 3,郵局協議第3版)收郵件協議;
?? ??? ??? ??? ?*IMAP:(Internet Message Access Protocol,因特網消息訪問協議)收發郵件協議。

?? ??? ?3.理解郵件收發過程
?? ??? ??? ?把郵件服務器理解為郵局,如果你需要寄一封信,那么你需要把信封放到信筒中,這樣你的信就會“自動”到達郵局,郵局會把信郵寄到另一個地方的郵局中。然后這封信會被送到收信人的郵箱中。最終收信人需要自己經常查看郵箱中是否有新的信件。
?? ??? ??? ?其實每個郵件服務器都有SMTP服務器和POP3服務器構成,其中SMTP服務器負責發郵件的請求,而POP3負責收郵件的請求。

?? ??? ??? ?當然,有時會使用163的賬戶,向126的賬號發送郵件。這時郵件是發送到126的郵件服務器,而對于163的郵件服務器是不會存儲這封郵件的。

?? ??? ?4.郵件服務器名稱
?? ??? ??? ?SMTP服務器的端口號為25,服務器名稱為smtp.xxx.xxx。
?? ??? ??? ?POP3服務器的端口號為110,服務器名稱為pop3.xxx.xxx。
?? ??? ??? ?例如:
?? ??? ??? ??? ?*163:smtp.163.com和pop3.163.com;
?? ??? ??? ??? ?*126:smtp.126.com和pop3.126.com;
?? ??? ??? ??? ?*qq:smtp.qq.com和pop3.qq.com;
?? ??? ??? ??? ?*sohu:smtp.sohu.com和pop3.sohu.com;
?? ??? ??? ??? ?*sina:smtp.sina.com和pop3.sina.com。

?? ?telnet收發郵件
?? ??? ?1.BASE64加密
?? ??? ??? ?BASE64是一種加密算法,這總加密方式是可逆的。它的作用是使加密后的文本無法通過肉眼識別。java提供了sun.misc.BASE63Encoder這個類,用來對做Base64的加密和解密。
?? ??? ??? ??? ?
?? ??? ??? ??? ?import org.apache.commons.codec.binary.Base64;

?? ??? ??? ??? ?public class Base64Utils {
?? ??? ??? ??? ??? ?public static String encode(String s) {
?? ??? ??? ??? ??? ??? ?return encode(s, "utf-8");
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?public static String decode(String s) {
?? ??? ??? ??? ??? ??? ?return decode(s, "utf-8");
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?public static String encode(String s, String charset) {
?? ??? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ??? ?byte[] bytes = s.getBytes(charset);
?? ??? ??? ??? ??? ??? ??? ?bytes = Base64.encodeBase64(bytes);
?? ??? ??? ??? ??? ??? ??? ?return new String(bytes, charset);
?? ??? ??? ??? ??? ??? ?} catch (Exception e) {
?? ??? ??? ??? ??? ??? ??? ?throw new RuntimeException(e);
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}

?? ??? ??? ??? ??? ?public static String decode(String s, String charset) {
?? ??? ??? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ??? ??? ?byte[] bytes = s.getBytes(charset);
?? ??? ??? ??? ??? ??? ??? ?bytes = Base64.decodeBase64(bytes);
?? ??? ??? ??? ??? ??? ??? ?return new String(bytes, charset);
?? ??? ??? ??? ??? ??? ?} catch (Exception e) {
?? ??? ??? ??? ??? ??? ??? ?throw new RuntimeException(e);
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}

?? ??? ?2.telnet發郵件
?? ??? ??? ?連接163的smtp服務器:telnet smtp.163.com 25;
?? ??? ??? ?連接成功后需要如下步驟才能發送郵件:
?? ??? ??? ??? ?1.與服務器打招呼:ehlo你的名字
?? ??? ??? ??? ?2.發出登錄請求:auth-login
?? ??? ??? ??? ?3.輸入加密后的郵箱名:(1451388723@qq.com)aXRjYXN0X2N4ZkAxNjMuY29t
?? ??? ??? ??? ?4.輸入加密后的郵箱密碼:(123456)aXRjYXN0
?? ??? ??? ??? ?5.輸入誰來發送郵件,即from:mail from:<1451388723@qq.com>
?? ??? ??? ??? ?6.輸入把郵件發給誰,即to:rcpt to:<475652900@qq.com>
?? ??? ??? ??? ?7.發送添加數據請求:data
?? ??? ??? ??? ?8.開始輸入數據,數據包含:from、to、subject、以及郵件內容,如果輸入結束后,以一個“.”為一行,表示輸入結束;
?? ??? ??? ??? ?
?? ??? ??? ??? ??? ?from:<1451388723@qq.com>
?? ??? ??? ??? ??? ?to:<475652900@qq.com>
?? ??? ??? ??? ??? ?subject: 我愛上你了

?? ??? ??? ??? ??? ?我已經深深的愛上你了。
?? ??? ??? ??? ??? ?.

?? ??? ??? ??? ??? ?注意:在標題和郵件正文之間要有一個空行。當要退出時,一定要以一個“.”為單行,表示輸入結束。
?? ??? ??? ??? ?9.最后一步:quit

?? ??? ?3.telnet收郵件
?? ??? ??? ?1.telnet收郵件的步驟
?? ??? ??? ??? ?pop3無需使用Base64加密。
?? ??? ??? ??? ?收郵件連接的服務器是pop3.xxx.com,pop3協議的默認端口號為110。請注意。這與發郵件完全不同。如果你在163有郵箱賬號,那么你想使用telnet收郵件,需要連接的服務器是pop3.163.com。

?? ??? ??? ??? ?*連接pop3服務器:telnet.pop3.163.com 110
?? ??? ??? ??? ?*user命令:user 用戶名,例如:user 1451388723@163.com;
?? ??? ??? ??? ?*pass命令:pass 密碼,例如:pass 123456
?? ??? ??? ??? ?*stat命令:stat命令用來查看郵箱中郵件的個數,所有郵件所占的空間;
?? ??? ??? ??? ?*list命令:list命令用來查看所有郵件,或指定郵件的狀態,例如:list 1是查看第一封郵件的大小,list是查看郵件列表,即列出所有郵件的編號,及大小;
?? ??? ??? ??? ?*retr命令:查看指定郵件的內容,例如:retr 1#是查看第一封郵件的內容;
?? ??? ??? ??? ?*dele命令:標記某郵件為刪除,單不是馬上刪除,而是在退出時才會真正的刪除;
?? ??? ??? ??? ?*quit命令:退出。如果在退出之前已經使用了dele命令標記了某些郵件,那么會在退出時刪除它們。

?? ?JavaMail
?? ??? ?1.JavaMail概述
?? ??? ??? ?JavaMail是由SUN公司提供的專門針對郵件的api,主要的jar包:mail.jar、activation.jar。
?? ??? ??? ?在使用MyEclipse創建web項目時,需要小心。如果只是在web項目中使用JavaMail是沒有什么問題的,發布到Tomcat上運行一點問題都沒有。
?? ??? ??? ?但是在web項目中寫測試那就出問題了。
?? ??? ??? ?在MyEclipse中,會自動給web項目導入javax.mail包中的類,但是不全(其實是只有接口,而沒有接口的實現類),所以只靠MyEclipse中的類是不能運行JavaMail項目的,但是如果這時你再去自行導入mail.jar時,就會出現沖突。
?? ??? ??? ?處理方案:到下面路徑中找到javaee.jar文件,把javax.mail刪除。

?? ??? ?2.JavaMail中主要類
?? ??? ??? ?JavaMail中主要類:javax.mail.Session、javax.mail.internet.MimeMessage、javax.mail.Transport。
?? ??? ??? ?Session:表示會話,即客戶端與郵件服務器之間的會話,想要獲得會話需要給出賬戶和密碼,當然還要給出服務器名稱。在郵件服務器中的Session對象,就相當于連接數據庫時的Commection對象。
?? ??? ??? ?MimeMessage:表示郵件類,它是Message的子類。它包含郵件的主題(標題)、內容,收件人地址、發件人地址,還可以設置抄送和暗送,甚至還可以設置附件。
?? ??? ??? ?Transport:用來發送郵件。它是發送器。

?? ??? ?3.JavaMail之HelloWorld
?? ??? ??? ?在使用telnet發郵件時,還需要自己來處理Base64編碼對問題,但是使用Javamail就不必理會這些問題了,都有JavaMail來處理。

?? ??? ??? ?第一步:獲取Session
?? ??? ??? ??? ?Session session = Session。getInstance(Properties prop, Authenticator auth);
?? ??? ??? ??? ?其中prop需要制定兩個鍵值,一個是制定服務器主機名,另一個是指定是否需要認證。
?? ??? ??? ??? ?Properties prop = new Properties();
?? ??? ??? ??? ?prop.setProperty("mail.host", "smtp.qq.com");//設置服務器主機名
?? ??? ??? ??? ?prop.setProperty("mail.smtp.auth", "true");//設置需要認證

?? ??? ??? ??? ?其中Authenticator是一個接口表示認證器,集校驗客戶端的身份。我們需要自己來實現這個接口,實現這個接口需要使用賬戶和密碼。
?? ??? ??? ??? ??? ?Authenticator auth = new Authenticator(){
?? ??? ??? ??? ??? ??? ?public PasswordAuthentication getPasswordAuthentication(){
?? ??? ??? ??? ??? ??? ??? ?return new PasswordAuthentication("1451388723", "123456");//用戶名和密碼
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}

?? ??? ??? ??? ?通過上面的準備,現在可以獲取Session對象了:
?? ??? ??? ??? ??? ?Session session = Session.getInstance(prop, auth);

?? ??? ??? ?第二步:創建MimeMessage對象
?? ??? ??? ??? ?創建MimeMessage需要使用Session對象來創建:
?? ??? ??? ??? ??? ?MimeMssage msg = new MimeMessage(session);
?? ??? ??? ??? ?然后需要設置發信人地址、收信人地址、主題,以及郵件正文。
?? ??? ??? ??? ??? ?msg.setFrom(new InternetAddress("1451388723@qq.com"));//設置發信人
?? ??? ??? ??? ??? ?msg.setRecipients(RecipientType.TO, "1451388723@qq.com", "1451388724@qq.com");//設置多個收信人
?? ??? ??? ??? ??? ?msg.setRecipients(RecipientType.CC, "1451388723@sina.com","1451388724@sina.com");//設置多個抄送
?? ??? ??? ??? ??? ?msg.setRecipients(RecipientType.BCC, "475652900@qq.com");//設置暗送人
?? ??? ??? ??? ??? ?msg.setSubject("這是一封測試郵件");//設置主題(標題)
?? ??? ??? ??? ??? ?msg.setContent("當然是HelloWorld。","text/plain;charset=utf-8");//設置正文

?? ??? ??? ?第三步:發送郵件:
?? ??? ??? ??? ?Transport.send(msg);//發送郵件


?? ??? ?4.JavaMail發送帶有附件的郵件(了解)
?? ??? ??? ?一封郵件可以包含正文、附件N個,所有正文與N個附件都是有郵件的一個部分。
?? ??? ??? ?上面的HelloWorld案例中,只是發送了帶有正文的郵件,所以在調用setContent()方法時直接設置了正文,如果想要發送帶有附件郵件,那么需要設置郵件的內容為MimeMultiPart。
?? ??? ??? ??? ?MimeMulitpart parts = new MimeMulitpart();//多部件對象,可以理解為是部件的集合
?? ??? ??? ??? ?msg.setContent(parts);//設置郵件的內容為多部件內容。
?? ??? ??? ??? ?然后我們需要把正文、N個附件創建為“主體部件”對象(MimeBodyPart),添加到MimeMuiltPart中即可。
?? ??? ??? ??? ?MimeBodyPart part1 = new MimeBodyPart();//創建一個部件
?? ??? ??? ??? ?part1.setContent("這是正文部分", "text/html;charset=utf-8");//給部件設置內容
?? ??? ??? ??? ?parts.addBodyPart(part1);//把部件添加到部件集中。

?? ??? ??? ?下面我們創建一個附件:
?? ??? ??? ??? ?MimeBodyPart part2 = new MimeBodyPart();//創建一個部件
?? ??? ??? ??? ?part2.attachFile("d:\\a.jpg");//設置附件
?? ??? ??? ??? ?part2.setFileName("hello.jpg");//設置附件名稱
?? ??? ??? ??? ?part2.addBodyPart(part2);//把附件添加到部件集中

?? ??? ??? ?注意:如果在設置名稱中,文件名稱中包含了中文的話,那么需要使用MimeUitlity類來給中文編碼:
?? ??? ??? ??? ?part2.setFileName(MimeUitlity.encodeText("美女.jpg"));

?? ??? ??? ??? ?

轉載于:https://www.cnblogs.com/changemax/p/10015058.html

總結

以上是生活随笔為你收集整理的Javaweb学习笔记——(二十二)——————文件上传、下载、Javamail的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

黄色av成人在线观看 | av在线电影网站 | 中文字幕在线观看完整 | 日韩高清免费在线 | 成人黄色免费在线观看 | 色噜噜在线观看视频 | 日韩久久视频 | 欧美成a人片在线观看久 | 成人性生交视频 | 欧美激情亚洲综合 | 欧美成人精品在线 | 黄色特一级片 | 免费在线观看91 | 日韩欧美观看 | 人人草天天草 | 黄网站大全| 天天草av| 美国人与动物xxxx | 久久99亚洲精品久久久久 | 五月天国产精品 | 天天躁日日躁狠狠躁av麻豆 | 天躁狠狠躁 | 在线成人看片 | 色成人亚洲 | 日韩视频一区二区三区在线播放免费观看 | 欧美日韩中文字幕综合视频 | 97久久精品午夜一区二区 | 91在线视频精品 | 精品国产免费av | 亚洲精品在线网站 | 一级性av| 天天爱天天操天天射 | 中文字幕网址 | 亚洲精品av在线 | 亚洲精品免费观看 | 色黄www小说 | 人人狠| 婷婷激情综合网 | 深爱激情久久 | 国产精品久久99综合免费观看尤物 | 久草视频一区 | 天堂久久电影网 | 久久精品屋 | 在线观看免费黄视频 | 狠狠狠狠狠狠狠狠 | 婷婷精品在线视频 | 亚洲国产成人久久综合 | 久久久久久国产一区二区三区 | 999久久久 | 国内久久久久久 | 一级大片在线观看 | 免费日韩一区 | 国产中的精品av小宝探花 | 夜夜操夜夜干 | 日韩一级黄色大片 | av中文字幕在线看 | 99久久久久久久久 | 欧美日韩精品在线观看 | 国产91综合一区在线观看 | 手机看片1042 | 人人干人人超 | 久久中文欧美 | av黄色影院 | 亚洲性xxxx | 97超碰.com| 亚洲精品美女久久 | 欧美精品在线免费 | 亚洲激情综合 | 99视频在线播放 | 国产日韩欧美在线看 | 一区二精品 | 亚洲欧美一区二区三区孕妇写真 | 久久久久久精 | 五月天久久激情 | 中文字幕 第二区 | 91视频一8mav | 免费不卡中文字幕视频 | 亚洲人人精品 | 国产精品v欧美精品v日韩 | 日韩网站一区 | 国产资源av | 亚洲精品免费在线视频 | 成 人 黄 色 视频播放1 | 亚洲影院天堂 | 日韩欧美视频一区二区三区 | www.超碰| 99午夜| 黄色网在线免费观看 | 久久精品欧美一区二区三区麻豆 | 波多野结衣综合网 | 午夜精品久久久 | 97香蕉超级碰碰久久免费软件 | 97在线观看免费视频 | 欧美另类视频 | 国产精品去看片 | 亚洲黄色在线播放 | 成人97视频 | 久久国产品 | 国产高清视频 | 97精品国自产拍在线观看 | 久久系列 | 日韩大陆欧美高清视频区 | 亚洲在线视频播放 | 日韩在线字幕 | av三级av| 日韩一三区 | 射射射av | 人人精品久久 | 日日干美女 | 国内亚洲精品 | 国产精品毛片一区视频播不卡 | 午夜精选视频 | 日av免费| 九草视频在线 | 亚洲成av人电影 | 91系列在线| 国产精品毛片一区二区在线看 | 色综合中文综合网 | 国产成人黄色av | 国产精品色视频 | 亚洲日日夜夜 | 9在线观看免费高清完整版 玖玖爱免费视频 | 亚洲免费视频在线观看 | 久久久在线免费观看 | 天天爱天天射天天干天天 | 91亚洲综合 | 91免费高清| 国内99视频 | 曰韩精品| 日本精品xxxx | 日本中文字幕久久 | 69国产精品视频免费观看 | 国产精品高清在线 | 欧美在线观看禁18 | 少妇av片| 国产精品第52页 | 亚洲天堂免费视频 | 国产四虎在线 | 91香蕉视频污在线 | 国产日产精品一区二区三区四区 | 一区二区免费不卡在线 | 又黄又爽又色无遮挡免费 | 国产精品视频专区 | 午夜精品久久久久久久99水蜜桃 | 在线观看国产一区二区 | 久久精品高清视频 | 美女视频黄网站 | www五月 | 国色天香在线观看 | 在线观看精品黄av片免费 | 国产伦理久久精品久久久久_ | 欧美成人日韩 | 伊人手机在线 | 中文字幕免费观看视频 | 久久九九影院 | 99久久久国产精品免费99 | 久久久久久久久久免费 | av在线播放网址 | 日韩欧美视频一区二区三区 | 国内精品小视频 | 欧美精品视 | 一区二区电影网 | 国产在线视频不卡 | 国产区精品| 亚洲视频456| 国产精品成人一区二区三区 | 在线观看av国产 | 国际av在线 | 亚洲欧美综合精品久久成人 | 97狠狠干| 日韩精品一区二区三区不卡 | 国产xxxx性hd极品 | 国产成人一区二区三区久久精品 | 久草综合在线观看 | 久久极品 | 97国产在线观看 | 在线观看深夜视频 | 亚洲精品欧美专区 | 成人国产精品一区二区 | 中文字幕视频在线播放 | 最近免费中文字幕mv在线视频3 | 国产精品影音先锋 | 亚洲精品免费在线视频 | 国产精品电影一区 | 91精品啪在线观看国产81旧版 | 成人精品久久 | 久久人人爽爽人人爽人人片av | 国产精品美女久久久久aⅴ 干干夜夜 | 国产成人一区二区三区影院在线 | 亚洲天堂毛片 | 91精品国产自产老师啪 | 一区二区三区 亚洲 | 97国产精品 | 国产精品美女久久久久久2018 | 久草在线这里只有精品 | 国产中文字幕91 | av中文资源在线 | 美女视频黄,久久 | 人人看人人 | 成人久久久精品国产乱码一区二区 | 欧美日韩成人 | 国内精品久久久久久久97牛牛 | 日本不卡一区二区三区在线观看 | 91久久在线观看 | 97超碰中文字幕 | 欧美日韩视频网站 | 97视频在线观看网址 | 天天夜夜狠狠操 | 亚洲天天在线日亚洲洲精 | 九色自拍视频 | 中文字幕日韩伦理 | 久久视频在线观看 | 九九在线免费视频 | 又色又爽又黄高潮的免费视频 | 波多野结衣久久资源 | 国产精品一区二区62 | 91桃色国产在线播放 | 狠狠狠色丁香婷婷综合激情 | 日韩精品专区在线影院重磅 | av电影在线播放 | 香蕉视频在线看 | 91麻豆精品国产自产 | 97成人免费 | 国外调教视频网站 | 国产二区视频在线 | 国产精品刺激对白麻豆99 | 99久久日韩精品免费热麻豆美女 | 久草网站在线观看 | 亚洲男男gaygay无套 | 日韩色视频在线观看 | 成人免费视频播放 | 欧美一级免费片 | 色婷婷成人 | 日韩综合一区二区三区 | 最新国产在线视频 | 伊人色综合久久天天 | 美女黄视频免费 | 97人人超碰在线 | 国产福利91精品张津瑜 | 成人资源在线观看 | 国产成人三级三级三级97 | 国产成人av网站 | 四虎成人精品永久免费av | 久久久久久久久影院 | 日韩精品一区电影 | 色综合天天综合网国产成人网 | 久久tv| 黄网站污 | 伊人欧美| 国产黄色播放 | 精品国产乱码久久久久久1区二区 | 成人久久18免费网站麻豆 | 日韩欧美区 | 久久久99精品免费观看app | 99色亚洲| 91香蕉视频 | 久久精品—区二区三区 | 又黄又刺激视频 | 国产va饥渴难耐女保洁员在线观看 | a级片在线播放 | 狠狠干夜夜 | 久久久精品网站 | 久久高清免费视频 | 怡红院久久 | 久久久91精品国产一区二区精品 | 久久久久久久久久久综合 | 日韩欧美一区二区在线播放 | 99热在线看 | 亚洲午夜精品一区二区三区电影院 | 久草免费在线观看 | 日本中文一区二区 | 亚洲欧美日韩国产一区二区三区 | 婷婷激情av | 天天射天天舔天天干 | 2021国产在线 | 99热精品免费观看 | 欧美乱码精品一区二区 | 国产精品久久一区二区三区不卡 | 最近中文字幕免费大全 | 一二三区av | 亚洲免费婷婷 | 国产精品2019 | 久久久wwww| 亚洲精区二区三区四区麻豆 | 国产一二区在线观看 | 永久免费观看视频 | 久久久久久久久久久久久久电影 | 国产精品久久久久久久久久久久午 | 亚洲四虎在线 | 天天干夜夜擦 | 天天色天天艹 | 久久婷婷影视 | 成年人在线观看视频免费 | 久艹视频在线观看 | 国产污视频在线观看 | 久久精品99久久久久久2456 | 999久久a精品合区久久久 | 欧美日韩视频在线 | 麻豆高清免费国产一区 | www.天天干.com | 综合色狠狠 | 丁香六月天 | 国产精品久久久久毛片大屁完整版 | 中文乱码视频在线观看 | 天天色综合天天 | 黄色三级在线观看 | 日韩电影黄色 | 一级黄色电影网站 | 成人h视频在线 | 99精品国产免费久久久久久下载 | 色中色综合 | 91网址在线看 | 日韩激情视频在线 | 国产精品99久久久久久武松影视 | 国产伦理一区 | 国产小视频网站 | 青青视频一区 | 欧美va在线观看 | 国产小视频免费观看 | 久久97久久 | 国产精品大尺度 | 国产福利免费在线观看 | 婷婷开心久久网 | 欧美国产日韩一区二区三区 | 国产免费小视频 | 9在线观看免费高清完整版 玖玖爱免费视频 | 久久1区 | 国产精品久久久久久久午夜片 | 久久 在线| 色视频国产直接看 | 精品欧美日韩 | 日日爽视频 | 91在线一区 | 国产精品视频免费 | 欧美成年人在线观看 | 国产生活一级片 | 国产 字幕 制服 中文 在线 | 中文字幕高清av | 久久嗨 | 久久99热精品 | 99久久精品国产毛片 | 日韩在线影视 | 人成在线免费视频 | av一级一片 | 蜜桃av人人夜夜澡人人爽 | 黄色片网站大全 | 亚洲一级在线观看 | 手机看片国产日韩 | 五月天天在线 | 91香蕉视频 mp4| 天天色天天搞 | 国产高清在线不卡 | 久草在线视频中文 | 国产精品99久久久久久久久久久久 | av在线电影播放 | 中文字幕av免费在线观看 | 国产一区二区电影在线观看 | 91精品视频免费看 | 四季av综合网站 | 毛片精品免费在线观看 | 97在线免费观看 | 中文在线字幕免费观看 | 99国产精品一区 | 国产精品日韩欧美一区二区 | 久久精品最新 | 国产成人精品一区二区 | 九九久久精品 | 99精品99 | 激情久久五月 | 精品国产91亚洲一区二区三区www | 国产精品美女久久久免费 | 91亚洲在线 | 久操视频在线免费看 | 精品视频www| av丝袜在线| 亚洲成a人片综合在线 | 国产黄色大片免费看 | 精品视频资源站 | 国产中文字幕网 | 黄色视屏在线免费观看 | 精品一区二区影视 | 欧美激情综合色综合啪啪五月 | 中文字幕在线观看网 | 91网在线看 | 久久久久久久免费观看 | 午夜av大片 | 久久精品高清视频 | 在线观看中文字幕一区 | 国产精品黄色影片导航在线观看 | 99久久精品国产毛片 | 91禁在线观看 | 日日夜夜添 | 成在线播放 | 97在线视 | 久久高清片| 欧美日韩中文在线观看 | www.天天射 | 天天干天天干天天干 | 91精品成人久久 | 97在线观看免费高清完整版在线观看 | 欧美一级欧美一级 | 国产久视频 | 日韩一级片网址 | 日韩高清免费在线 | 欧美一二三在线 | 国产午夜精品视频 | 97人人模人人爽人人喊网 | 国产免费又粗又猛又爽 | 成年人免费观看在线视频 | 国产人成精品一区二区三 | 五月天六月丁香 | 久久一区二区三区国产精品 | 久草视频看看 | 四虎天堂 | 久久久片 | 国产精品theporn | 狠狠综合久久 | 日本高清xxxx | 国产一区免费在线 | 国产中文字幕网 | 亚洲爱视频| 国产精品久久久久久久久久妇女 | 国产精品综合av一区二区国产馆 | 国产精品黄色影片导航在线观看 | 在线精品视频在线观看高清 | 欧美在线free | jizz999| 国产精品24小时在线观看 | 免费日韩一级片 | 成人精品亚洲 | 综合色在线观看 | 国产精品久久久久久久久婷婷 | 欧美一级免费黄色片 | 免费在线观看日韩欧美 | 精品国产乱码久久久久久天美 | 久久精品精品 | 亚洲国产精品一区二区久久hs | 91色偷偷 | 五月婷婷天堂 | 久久免费精品国产 | 免费成人短视频 | 欧美久久久一区二区三区 | 在线看不卡av | 久久久久久久久久毛片 | a视频在线播放 | 亚洲欧美色婷婷 | 怡红院av久久久久久久 | 999亚洲国产996395 | 91色综合| 日韩中文在线电影 | 看污网站| 久久久久久久久久免费视频 | av免费在线网 | 91久久精品一区二区二区 | 久久久96 | 天天射天天干天天爽 | 456成人精品影院 | 国产成人黄色网址 | 国产一区二区久久 | 日韩一级电影网站 | 天堂视频中文在线 | 成人h在线 | 草免费视频 | 超碰免费av | 欧美极度另类性三渗透 | wwwwww色| 国产精品一区久久久久 | 久久久久亚洲天堂 | 亚洲永久精品视频 | 久久精品亚洲国产 | 国产98色在线 | 日韩 | 国产午夜精品一区二区三区嫩草 | 91热视频在线观看 | www.色就是色 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 婷婷九月丁香 | 精品99视频 | 欧美日韩亚洲第一页 | 亚洲伦理一区二区 | 亚洲精品1区2区3区 超碰成人网 | 黄免费网站 | 香蕉影视 | 欧美一级高清片 | 久久精品久久久久 | 国产99免费视频 | 亚洲a在线观看 | 色九九影院 | 99999精品| 欧美在线视频一区二区三区 | 色美女在线 | 欧美精品乱码久久久久 | 91福利视频免费 | 在线日韩av| 久久久精品国产免费观看一区二区 | 三级av免费看 | 国产综合香蕉五月婷在线 | 亚洲精品午夜一区人人爽 | 日韩成人邪恶影片 | 99久久精品国产亚洲 | 丰满少妇在线观看网站 | 中文字幕在线视频一区二区 | 国产精品免费观看视频 | 91精品无人成人www | 日韩欧美极品 | 精品一区二区三区在线播放 | 午夜婷婷在线观看 | 久久精品高清视频 | 精品在线观看一区二区 | 国产高清视频色在线www | 日韩视 | 国产精品亚洲a | 国产高清不卡在线 | 婷婷伊人五月天 | 中文在线www | av天天干 | 日韩区欠美精品av视频 | 亚洲码国产日韩欧美高潮在线播放 | 国产精品久久久久久久久毛片 | 成人网在线免费视频 | 天天天色 | 日韩有码第一页 | 精品欧美一区二区精品久久 | 日韩一区二区三免费高清在线观看 | 亚洲免费黄色 | 国产中文字幕三区 | 欧美日韩视频在线一区 | 亚洲精品久久久久999中文字幕 | 激情视频在线观看网址 | 精品亚洲视频在线观看 | 又黄又爽又刺激的视频 | 亚洲综合在线视频 | 久久天天躁 | 日韩精品免费在线观看 | 超碰人人超 | 西西人体www444 | 久久久久久久久久久久久国产精品 | 一区二区三区 亚洲 | 天天操夜夜摸 | 国产综合精品久久 | 丁香五月网久久综合 | 欧美成人精品在线 | 精品成人在线 | 丁香五月亚洲综合在线 | 日韩a级黄色 | 国产一级片播放 | 亚洲一级国产 | 日韩av电影中文字幕 | 日韩视频一区二区在线 | av三级在线看| 激情av在线播放 | 91电影福利 | 色网站免费在线看 | 久草在线资源观看 | 久久久电影 | 成人免费在线视频观看 | 久久成人一区二区 | 成人xxxx | 91精品一区国产高清在线gif | 国产精品久久精品 | 国产黄色精品视频 | 香蕉在线视频播放网站 | 永久免费av在线播放 | 免费观看国产成人 | 国产精品一区在线播放 | 97精品一区二区三区 | 一区二区男女 | 9色在线视频| av一本久道久久波多野结衣 | 久久久久久国产精品999 | 美女视频黄在线观看 | 黄色精品网站 | 久久久久在线 | 日韩精品三区四区 | 中文在线天堂资源 | 免费在线观看av片 | 丁香婷婷激情国产高清秒播 | 免费视频一区 | 最近日本中文字幕 | 久久视频这里有久久精品视频11 | 国色天香在线观看 | www看片网站 | 国产你懂的在线 | 国产一区二区午夜 | 亚洲好视频| 欧美一区二区三区在线观看 | 欧美韩国日本在线 | 91av视频在线免费观看 | 少妇bbw揉bbb欧美 | 摸阴视频 | 国产精品免费在线 | 国产区欧美 | 色网av | 激情五月激情综合网 | 亚洲最大成人网4388xx | 久久久久久欧美二区电影网 | 在线亚洲成人 | 亚洲综合在线观看视频 | 探花视频免费观看高清视频 | av色影院 | 国产精品免费久久久 | 国产在线观看a | 天天射天天干天天插 | 午夜视频在线观看欧美 | 最近高清中文字幕 | 日本精品一区二区三区在线观看 | 爱情影院aqdy鲁丝片二区 | 久久图 | 欧美在线99 | 国产成人久久av977小说 | 五月天丁香亚洲 | 亚洲国产高清在线观看视频 | 青青五月天 | 久草在线在线精品观看 | 免费在线观看成人 | 五月香婷 | 韩国av免费观看 | 亚洲精品在线观看网站 | 精品一区二区三区久久 | 国产精品大片免费观看 | 国产精品99久久久久人中文网介绍 | 久久特级毛片 | 一区二区三区在线免费观看视频 | 久久久久国产成人精品亚洲午夜 | 亚洲黄色一级电影 | 黄色网大全 | wwwwwww黄| 国产福利免费在线观看 | 中文字幕一区二区三区在线视频 | 欧洲精品码一区二区三区免费看 | 欧美国产一区二区 | 日本三级不卡视频 | 久久久五月婷婷 | 97国产精品久久 | www.色五月.com | 成人av高清在线观看 | 热久久视久久精品18亚洲精品 | 国产伦精品一区二区三区照片91 | 免费看在线看www777 | 国产玖玖视频 | 深爱五月激情五月 | 亚洲黄色在线免费观看 | 日韩在线观看视频网站 | 在线视频app | 欧美极品一区二区三区 | 免费观看久久 | 久久久精品99 | 欧美老女人xx | 91自拍视频在线观看 | 日韩在线精品视频 | 麻豆成人精品 | 国产一区二区精品在线 | 欧美在线观看禁18 | 99色在线播放 | 欧美精品二 | 欧美日韩在线观看一区 | 中文字幕精品一区 | 日本护士三级少妇三级999 | 中文字幕一区二区三区四区在线视频 | 在线观看国产www | 亚洲人成在线电影 | 久久精品99国产精品日本 | 国产乱对白刺激视频在线观看女王 | 最新国产视频 | 日韩欧美在线观看一区二区三区 | 欧美精品在线观看免费 | 国产麻豆精品一区二区 | 91视频黄色| 国产一区二区在线播放 | 岛国av在线不卡 | 激情开心网站 | 欧美天堂视频在线 | 99亚洲精品在线 | 久久久免费在线观看 | 五月天激情在线 | 不卡中文字幕在线 | 天天干天天做天天操 | 91成人网在线 | 香蕉视频网址 | 亚洲色影爱久久精品 | 精品亚洲网 | 天天av综合网 | 成人va在线观看 | av免费试看 | 四虎影院在线观看av | 狠狠色狠狠色综合系列 | 日本在线观看一区 | 最近中文国产在线视频 | 国产色网| 蜜臀av性久久久久av蜜臀妖精 | 在线不卡视频 | 国产在线观看av | 国产黄在线 | 国产中文字幕av | 五月天国产 | 高清精品在线 | 日韩欧美在线一区 | 91视频午夜 | 亚洲九九九在线观看 | 黄色日视频 | 91精品国产成人观看 | 精品黄色在线观看 | 天天操天天操天天操天天操天天操天天操 | 九草在线观看 | 丁香色天天 | 日韩欧美高清视频在线观看 | 日韩一区二区三区在线观看 | 久久精品视频免费 | 在线激情av电影 | 成人av在线播放网站 | 欧美一级高清片 | 国产中文字幕av | 九九热精| 成人午夜电影在线播放 | 狠狠躁天天躁 | 欧美va在线观看 | 亚洲激情校园春色 | 免费观看91 | 国产亚洲精品久久久久久网站 | 天天拍天天干 | 成人国产网址 | 国产精品ssss在线亚洲 | 99国产精品视频免费观看一公开 | 91在线看视频| 欧美,日韩 | 97精品国产97久久久久久久久久久久 | 一本色道久久精品 | 日韩欧美精品在线视频 | 免费在线观看一级片 | 91精品久久香蕉国产线看观看 | 日韩理论电影在线观看 | 激情综合站 | 亚洲精欧美一区二区精品 | 亚洲va天堂va欧美ⅴa在线 | 国产欧美高清 | 亚洲粉嫩av| 国产高清在线a视频大全 | 黄色大片网 | 午夜精品福利在线 | 91麻豆精品国产91久久久更新时间 | 韩国av一区二区 | 热久久影视 | 香蕉国产91 | 香蕉视频在线免费看 | 天天操夜夜操夜夜操 | 欧美一区二区三区激情视频 | 丰满少妇麻豆av | 六月婷婷网 | 国产成人久 | 久久久久久久免费 | 亚洲欧洲精品一区 | 精品99久久久久久 | 日韩高清精品免费观看 | 香蕉视频啪啪 | 国产黄色片一级三级 | 国产99久久九九精品 | 精品国内自产拍在线观看视频 | 日韩午夜剧场 | av黄色一级片 | 久久成人麻豆午夜电影 | 免费在线观看的av网站 | 久久久久北条麻妃免费看 | 97视频网址 | 香蕉视频网站在线观看 | 亚洲成a人片77777kkkk1在线观看 | 精品国产成人av在线免 | 丝袜美腿亚洲 | 97视频免费在线看 | 色欧美综合 | 99久久这里有精品 | 国产精品第54页 | 日韩最新中文字幕 | 亚洲 欧美 91| 在线有码中文字幕 | 久章草在线观看 | 中文字幕在线观看不卡 | 欧美 另类 交 | .国产精品成人自产拍在线观看6 | 欧美一区二区三区在线视频观看 | 免费看的国产视频网站 | 欧美高清成人 | 91在线资源 | av三级av | 色视频网站在线观看一=区 a视频免费在线观看 | 少妇bbb| 久久精品官网 | 免费黄色av. | 二区三区在线视频 | 久青草电影 | 久久一线 | 黄色在线免费观看网址 | 精品久久久久久综合 | 日韩视频免费观看高清完整版在线 | 正在播放一区二区 | 国产一卡久久电影永久 | www.狠狠| 久操久| 国产资源在线免费观看 | 麻豆视频免费入口 | 亚洲综合成人专区片 | 一区二区三区手机在线观看 | 日韩精品久久一区二区三区 | 精品亚洲欧美一区 | 国产精品永久免费视频 | 成人a大片| 91精品天码美女少妇 | 日日夜夜中文字幕 | 天堂网中文在线 | 久久艹欧美| 国产亚洲精品久久久久秋 | 日韩网页 | 免费中文字幕 | 中文字幕av免费 | 深爱激情av | 最新日韩精品 | 丁香激情网 | 久久久久久欧美二区电影网 | 午夜av电影院 | 日日噜噜噜噜夜夜爽亚洲精品 | 天天玩天天操天天射 | 中文字幕一区二区在线播放 | 3d黄动漫免费看 | 国产黄色特级片 | 欧美性生活一级片 | 亚洲精品在线免费观看视频 | 久久精品一二区 | 欧洲视频一区 | 国产一级片毛片 | 日韩在线观看网址 | av超碰在线 | 久久a视频 | 欧美综合色 | 久久99电影 | 国产精品嫩草影院9 | 国产激情久久久 | 亚洲全部视频 | 欧美资源在线观看 | 色网站在线免费观看 | 韩国一区二区三区视频 | 国产成人精品一区二区三区福利 | 99精品视频在线观看视频 | 色综合五月 | av电影免费在线 | 免费网址你懂的 | 国产精品视频app | 免费色网| 免费日韩一区 | 天天爽天天搞 | 日韩欧美视频一区 | 亚洲成av人影院 | 国产一区二区精品久久91 | 久草在线99 | 中国一级特黄毛片大片久久 | 色婷婷狠狠五月综合天色拍 | 免费在线观看不卡av | www.国产在线 | 日b视频在线观看网址 | 久久人人爽人人片av | 99热这里只有精品国产首页 | 麻豆视频免费入口 | 激情网在线观看 | 中文字幕精品三区 | 热久久99这里有精品 | 久视频在线播放 | 国产视频久久 | 久久精品视频2 | 日韩精品一区二 | 黄色视屏免费在线观看 | 亚洲精品在线网站 | 免费国产黄线在线观看视频 | 亚洲精品婷婷 | 国产精品午夜免费福利视频 | 91精品国产91热久久久做人人 | 中中文字幕av在线 | www.午夜色.com | 一级理论片在线观看 | 中文字幕av全部资源www中文字幕在线观看 | 天天插日日射 | 欧洲亚洲女同hd | 99久久综合国产精品二区 | 成人va视频 | 亚洲高清视频在线观看 | 午夜视频色 | 亚洲国产一区av | 91av网站在线观看 | 国产色区| 91精品免费视频 | 国产不卡在线观看 | 99国产精品久久久久久久久久 | 狠狠干免费 | 在线之家免费在线观看电影 | 一区二区三区在线看 | 久久久久久草 | 亚洲综合五月天 | 五月综合久久 | 99精品视频免费观看视频 | 午夜精品久久久久久久99水蜜桃 | 国产麻豆精品久久 | 国产视| 天天操天天操天天操天天操天天操天天操 | av黄色免费看| 亚洲视频久久久久 | 婷婷国产在线观看 | 久久久精品成人 | 国产精品成人自产拍在线观看 | 日本黄色免费播放 | 免费看国产一级片 | 999抗病毒口服液 | 久久久精品国产免费观看一区二区 | 亚洲精品九九 | 黄色综合 | 视频在线一区二区三区 | 黄色片免费电影 | 在线观看精品 | 欧美久久久久久久久久久久久 | 免费看的黄色录像 | 日韩视频免费在线观看 | 国产aa精品 | 国产精品一区二区精品视频免费看 | av高清免费 | 亚洲精品久久久久中文字幕m男 | 天天插夜夜操 | 国产一级黄色电影 | 久要激情网| 午夜精品电影 | 久久综合毛片 | 丁香一区二区 | 久久在线观看 | 欧美一级片免费在线观看 | 一区二区三区四区精品 | 亚洲精品1234区 | 日韩精品免费一线在线观看 | 九九综合久久 | 中文字幕在线播放一区二区 | 欧美性生活免费 | 久久这里只有精品23 | 免费网站在线观看成人 | 91精品资源 | 西西www4444大胆在线 | 日韩久久在线 | 国语自产偷拍精品视频偷 | 午夜免费在线观看 | 久久99久久精品国产 | 免费av一级电影 | 久久精品牌麻豆国产大山 | 中文字幕久久精品亚洲乱码 | 国产精品免费久久久久久 | 在线视频第一页 | 特黄特黄的视频 | 久久久久 | 免费av网站在线 | 久久久久这里只有精品 | 国产视频91在线 | 91av官网 | 国产精品99久久久久人中文网介绍 | av片免费播放 | 999日韩| 三级免费黄色 | 日韩在观看线 | 一区在线免费观看 | 成人蜜桃网 | 91禁在线观看 | 亚洲精品国久久99热 | 日韩成人欧美 | av在线之家电影网站 | 久久欧美在线电影 | 黄色小说视频在线 | 国产精品xxxx18a99 | 成人在线观看你懂的 | 99精品国产在热久久下载 | 欧美黄网站 | 黄色国产大片 | 日韩av片免费在线观看 | 国产v在线| 亚洲综合成人专区片 | 欧美在线视频一区二区三区 | 国产香蕉视频在线播放 | 中国一级片在线 | 久久久久一区 | 国产97碰免费视频 | 天天干 夜夜操 | 91在线欧美| 国产精品免费在线 | 久久成人国产精品免费软件 | 日韩网站在线 | 黄色软件网站在线观看 | 在线观看视频免费大全 | 在线观看日韩免费视频 | 色噜噜日韩精品欧美一区二区 | 深爱激情五月综合 | www.一区二区三区 | 黄色成人在线 | www亚洲一区 | 欧美日韩一区二区视频在线观看 | www国产亚洲精品久久网站 | 91麻豆精品国产91久久久久久 | av成人动漫 | 在线看免费 | av一级久久 |