摘要:文件上傳上傳對(duì)表單限制表單中需要添加文件表單項(xiàng)用戶名照片上傳上傳對(duì)限制文件上傳不能使用這個(gè)方法在表單為時(shí),它作廢了。
文件上傳 1.上傳對(duì)表單限制
method="post"
enctype="multipart/form-data"
表單中需要添加文件表單項(xiàng):
2.上傳對(duì)Servlet限制${msg }
文件上傳不能使用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集合:List4.FileItemfileItemList = sfu.parseRequest(request);
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文件下載 1.下載就是向客戶端響應(yīng)字節(jié)數(shù)據(jù)!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(); } }
把一個(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
搭建個(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),也更符合用戶的...
摘要:還有就是,我拿到的第一手?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è)步驟...
摘要:還有就是,我拿到的第一手?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è)步驟...
閱讀 2463·2021-10-08 10:17
閱讀 1841·2021-09-06 15:02
閱讀 2554·2019-08-29 17:30
閱讀 2677·2019-08-29 13:24
閱讀 1537·2019-08-29 11:12
閱讀 3351·2019-08-28 17:52
閱讀 679·2019-08-26 11:30
閱讀 3588·2019-08-26 11:01