JavaWeb之上传下载与JavaMail

2018-05-15  本文已影响38人  codingXiaxw

title: JavaWeb之上传下载与JavaMail
tag: JavaWeb upload JavaMail
categories: JavaWeb upload JavaMail


若图片无法显示,请前往我的博客查看,相应文章链接:http://codingxiaxw.cn/2016/11/02/31-%E4%B8%8A%E4%BC%A0%E4%B8%8B%E8%BD%BD%E4%B8%8EJavaMail/

对于JavaWeb中的上传与下载,别说你从没遇到过。

当我们要向网站中上传文件或者需要从网站上下载文件时,其实我们就已经玩了一遍上传与下载了。那么我们上传的文件会保存在服务器的哪里呢?下载的文件又是从服务器的哪里传过来的?这些又是怎么实现的呢?

另外很多时候我们注册某个公司的账号时,注册成功后该公司会给你填入的邮箱发送一封邮件,要求你点击邮件中的链接来给该账号激活。这个功能又是怎么实现的呢?

下面我将告诉你如何用代码实现这些功能。

1.对于多部件表单的体的理解

通过抓包的方式可以看到服务器发送过来的响应,理解如下:

1个头:Context-Disposition:包含name=“xxxx”,即表单项名称。
体就是表单项的值。

有2个头:a.Content-Disposition:包含name=“xxxx”,即表单项名称;还有一个filename=“xxx”,表示上传文件的名称。
Content-Type:它是上传文件的MIME类型,例如:image/pjpeg,表示上传的是图片,图片为jpg扩展名的图片。
体就是上传文件的内容。

2.实现文件的上传

首先我们需要明确的是要实现上传和下载功能都要借助第三方Jar包 fileupload.jar,依赖jar包为:commons-io.jar

2.1上传对表单的限制

2.2上传对servlet的限制

2.3上传的代码实现

涉及到的类:

代码步骤:

Demo:

image

FileItem的API

2.4上传的细节

为了不让浏览器直接访问到。

String fileName=file2.getName();//file2为FileItem对象  
    int index=fileName.lastIndex("\\");  
    if(index!=-1)
    {
        fileName=fileName.substring(index+1);
    }

解决方法:告诉fileupload你的编码方式,在servlet中设置代码request.setCharacterEncoding("utf-8");因为fileupload内部会调用request.getCharacterEncoding();得到你的编码方式。
解决方法1,在servlet中添加:request.setCharacterEncoding("utf-8");//优先级比下面的方式低
解决方法2,在servlet中添加:servletFileUpload.setHeaderEncoding("utf-8");//优先级比上面的方式低。也就是说,当同时出现解决方法1中的代码和解决方法2中的代码时,会优先使用方法2来设置编码方式。

fileName=CommonUtils.uuid()+"_"+fileName;

1.sfu.setFilesizeMax(100*1024);限制单个文件大小为100kb,此方法调用必须在解析开始之前调用。
2.如果上传的文件超过限制,则在parseRequest()方法时,会抛出异常。

sfu.setSizeMax(1024*1024);限制整个表单大小为1M。此方法调用必须在解析开始之前调用。
如果上传的文件超过限制,则在parseRequest()方法时,会抛出异常。超出限制大小时显示错误信息代码:需要在jsp文件中增加${msg}。
代码如下: [图片上传失败...(image-e3398e-1526285981316)]

说明:设置缓存大小与临时目录,在创建工厂时,调用DiskFileItemFactory的有参构造器:DiskFileItemFactory factory=new DiskFileItemFactory(缓存大小,硬盘临时目录路径);。当文件正在上传时,会在硬盘的该临时目录下出现这个文件;而当文件上传完毕时,硬盘下该临时目录下的这个文件就会消失。最后保存在web-inf的target目录下。

3.实现文件的下载

下文文件就是向客户端响应字节数据。当不涉及文件下载时你向服务器发出一个请求时,服务器返回的响应都是html的字符数据;而当涉及到文件下载时,服务器会把一个文件变成字节数组,使用response.getOutputStream();来响应给浏览器。

3.1文件下载的要求

设置两个头一个流:

3.2下载Demo

[图片上传失败...(image-6e30dd-1526285981316)]

3.3下载的细节

1.显示在下载框中的中文名称时,会出现乱码。

通用方案:frameName=new String(filename.getBytes("GBK"),"ISO-8859-1");

代码见下:[图片上传失败...(image-2fb7a5-1526285981316)]

注意downutil.jar包的使用

4.JavaMail

JavaMail是Java提供的一组API,用来发送和接收邮件。

需要导入的jar包为:1.mail.jar2.activation.jar

4.1与邮件相关的协议

smtp 25-->简单的邮件传输协议。
pop3 110-->邮局协议第三版

4.2核心类

1.Session(这跟我们Servlet中的HttpSession不同哦).

如果你得到了它,表示已经与服务器连接上了,与Connectin的作用相似。

得到Session,需要使用Session.getInstance(Properties,authenticator);方法。

得到Session对象的Demo如下:

Properties props=new Properties();
props.setProperty(“mail.host”,”smtp.163.com”);
props.setProperty(“mail.smtp.auth”,”true”);

Authenticator auth=new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication(){
    return new PasswordAuthentication(“username”,”password”);
    }
};

Session session=Session.getInstance(props,auth);

2.MimeMessage
它表示一个邮件对象,你可以调用它的setFrom()方法进行设置发件人、设置主题、设置正文。

3.TransPort
它只有一个发邮件的功能。

4.3完整Demo如下

[图片上传失败...(image-1bdb39-1526285981316)]

4.4带有附件的邮件

image

2018.3.19更

欢迎加入我的Java交流1群:659957958。群里目前已有1800人,每天都非常活跃,但为了筛选掉那些不怀好意的朋友进来搞破坏,所以目前入群方式已改成了付费方式,你只需要支付9块钱,即可获取到群文件中的所有干货以及群里面各位前辈们的疑惑解答;为了鼓励良好风气的发展,让每个新人提出的问题都得到解决,所以我将得到的入群收费收入都以红包的形式发放到那些主动给新手们解决疑惑的朋友手中。在这里,我们除了谈技术,还谈生活、谈理想;在这里,我们为你的学习方向指明方向,为你以后的求职道路提供指路明灯;在这里,我们把所有好用的干货都与你分享。还在等什么,快加入我们吧!

2018.4.21更:如果群1已满或者无法加入,请加Java学习交流2群:305335626 。群2作为群1的附属群,除了日常的技术交流、资料分享、学习方向指明外,还会在每年互联网的秋春招时节在群内发布大量的互联网内推方式,话不多说,快上车吧!

5.联系

If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.

上一篇 下一篇

猜你喜欢

热点阅读