上传,下载 javaMail

上传


1 上传对表单限制

method=“”post“”

enctype="multipart/form-data"

表单中需要添加文件表单项:<input type="file" name="xxx">


2 上传对servlet 限制

request.getParameter("xxx") 作废,返回永远都为null

ServletInputStream request.getInputStream    包含请求体


多部件表单的体

1 多个部件,即一个表单项一个部件

2 一个部件中自己包含请求头,和空行,以及请求体

3 文件表单项  Content-Disposition:包含name="xxxx",即表单项名称:还有一个filename="xxx",表示上传文件的名称

Content-Type :它是上传文件的MIME类型,例如:image/pjpeg,表示上传的是图片

体就是上传文件的内容


commons-fileupload.jar 依赖commons-io.jar

这个组件,会帮助解析request的上传数据,解析后的结果是一个表单项数据封装到一个FileItem对象中,之后调用方法即可


上传三步:

相关类:

工厂:DiskFileItemFactory

解析器:ServletFileUpload

表单项:FileItem

1 创建工厂:DiskFileItemFactory factory = new DiskFileItemFactory()

2 创建解析器:ServletFileUpload sfu = new ServletFileUpload(factory)

3 使用解析器来解析request,得到FileItem集合:List<FileItem> fileItemList = sfu.parseRequest(request) 

FileItem

boolean isFormField() 是否为普通表单项 返回true为普通表单项,否则为文件表单项

String getFiledName() 返回当前表单项的名称

String getString(String charset)  返回表单项的值

String getName() 返回上传的文件名称

long getSize() 返回上传文件的字节数

InputStream getInputStream() 返回上传文件对应的输入流

void write(File destFile) 把上传的文件内容保存到指定的文件中

String getContentType() 


上传的细节

1 文件必须保存到WEB-INF下

目的是不让浏览器直接访问到

2  文件名称相关问题

有的浏览器上传的文件名是绝对路径,这需要切割

String filename = fi2.getName();

int index = filename.lastIndexOf("\\");

if(index ! = -1){

filename = filename.substring(index+1);

}

文件名乱码或者普通表单项乱码: request.setCharacterEncoding("utf-8") ,因为内部调用request.getCharacterEncoding();

request.setCharacterEncoding("utf-8")

servletFileUpload.setHeaderEncoding("utf-8");//  优先级高 

文件名同名问题:我们需要为每个文件添加名称前缀,这个前缀可以使用uuid,保证不会重复

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

3 目录打撒

不能再一个目录下存放太多文件

首字母打撒:使用文件的首字母作为目录名称

时间打撒:使用当前时间作为目录

哈希打撒:通过文件 名称得到int值,即调用hashCode() ,将int值转换成16进制

用前两位用来生成目录,目录为两层,例如:1B2C3D   /1/B 保存 文件

4 上传文件的大小限制

单个文件的大小限制

解析器有一个setFileSizeMax(100*1024) 限制单个文件必须在解析开始之前

如果超出限制,parseRequest(request)  会抛出异常

整个请求所有数据的大小限制

setSizeMax(1024*1024) 限制整个表单大小为1m

如果超出限制    parseRequest(request)  会抛出异常

5  缓存大小与临时目录

服务器作为另一个应用程序,上传文件时,是先保存到内存,再保存到硬盘。当文件过大时,无法先保存到内存,所以需要先建立一个临时的文件,下载完成之后再保存到指定的目录。

缓存大小:超出多大,才向硬盘保存,默认10kb

临时目录:向硬盘的什么目录保存

设置缓存打下与临时目录:new DisFileItemFactory(20*1024,new File("F:/temp"))

下载


1 下载就是向客户端响应字节数据。一般响应的是html的字符数据

把一个文件变成字节数组,使用response.getOutputStream() 来响应给浏览器


2 下载的要求

两个头,一个流

Content-Type : 传递给客户端的文件是什么MIME类型(可以通过文件名获取 ServletContext的getMimeType()方法),例如 image/pjpeg

Content-Disposition: 默认值是inline ,表示在浏览器窗口打开,attachment;filename=xxx  显示在下载框中的文件名称

流:要下载 的文件数据

这里会用到commons-io 的一个方法,IOUtils.copy() 参数为两个流,一个绑定文件的流,一个响应客户端的流

3 下载的细节

1 显示在下载框中的中文名称

FireFox: Base64编码

其他大部分浏览器:URL编码

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

public static String filenameEncoding(String filename,HttpServletRequest request) throws IOException

{

Sting 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

是java提供的一组API 


邮件协议概述

SMTP:简单邮件传输协议,发邮件协议

POP3:收邮件协议

IMAP:收发邮件协议,因特网消息访问协议

邮件服务器名称

smtp服务器端口号为25,服务器名称为smtp.xxx.xxx

pop3服务器的端口号为110,服务器名称为pop3.xxx.xxx


导包  mail.jar activation.jar

核心类:

1 Session 

得到说明已经与服务器连接上了,与Connection的作用相似

需要使用Session.geiInsInstance(Properties props,Authenticator auth)

Properties prop = new Properties ();

prop.setProperty("mail.host","smtp.163.com")

prop.setProperty("mail.smtp.auth","true")

Authenticator auth = new Authenticator (){

protected PasswordAuthentication getPasswordAuthtication (){

return new PasswordAuthentication(用户名,密码); 

}

};

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

2 MimeMessage

表示一个邮件对象,你可以调用它的setForm() 设置发件人,设置收件人,设置主题,设置正文

setContent();   添加多部件

3 TransPort

发邮件 TransPort.send(message)

当发送包含多附件的邮件是,邮件体就为多部件形式

1 创建一个多部件的部件内容,MimeMultipart 一个多部件可包含多个主体

MimeMultipart就是一个集合,用来装载多个主体部件  addBodyPart()

2 我们需要创建两个主体部件,一个是文本内容的,另一个是附件的  主体部分叫MimeBodyPart 方法:attachFile()   setContent()    setFilename()

3 把MimeMultipart设置给MimeMessage


MailUtils工具

方法:createSession(服务器名称,账户,密码); (静态) 得到Session

Mail mail  = new Mail(发件人,收件人,主题,正文)

AttachBean ab = new AttachBean(new File(""),文件名称)

mail.addAttach();

send(session,mail) (静态) 发送

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值