文件上传
来源:互联网 发布:华为沧州云计算 编辑:程序博客网 时间:2024/05/21 15:14
1. 开发中要注意的问题:线程安全,事务,用户输入的数据(脚本,null)
文件上传:
一、文件上传
1、页面注意事项
a、表单的enctype必须是multipart/form-data,method必须是post
b、文件上传的地方用<input type="file" name="">来提供,并且要指定一个name
2、我们一般采用apache提供的组件来解析上传文件的内容
a、准备开发环境:commons-fileupload.jar和commons-io.jar
b、编写步骤:
//1、得到DiskFileItemFacotry对象
//2、得到上传文件的核心类ServletFileUpload
//3、判断用户的表单有没有设置为multipart/form-data
//4、如果设置了,解析request中的主体内容,List<FileItem>
//5、遍历List
//6、如果是普通字段,打印
//7、上传:上传到哪个目录
二、文件上传要解决的问题
1、上传文件名的中文乱码和表单数据的中文乱码
文件名乱码:ServletFileUpload.setHeaderEncoding("UTF-8")
表单数据中文乱码:FileItem.getString("UTF-8");
2、如何保证服务器的安全
把上传的文件放到用户访问不到的地方WEB-INF
3、多次上传同名文件的覆盖
更改上传文件的名称,保证更改后的文件名唯一即可。
陈冠希.jpg----------->23432432432432432_陈冠希.jpg
UUID
4、如何防止同一目录下文件太多的问题
把上传的文件打撒后保存
a、根据日期分别创建一个文件夹
b、hashCode算法
5、上传文件的大小控制(单个文件和总大小),及如何友好提示用户
抓FileUploadBase.FileSizeLimitExceededException:单个文件大小限制
抓FileUploadBase.SizeLimitExceededException:总文件大小限制
6、超出10k的文件的临时文件的处理
组件默认不会删除临时文件,造成空间浪费
FileItem.delete();
7、限制上传文件的类型
通过判断上传文件的扩展名(无法严格地做到)
8、监听文件的上传进度
upload.setProgressListener(new ProgressListener() {
public void update(long pBytesRead, long pContentLength, int pItem) {
System.out.println("当前上传了:"+pBytesRead+"\t总大小:"+pContentLength);
}
});
利用AJAX技术呈现给客户
9、用户没有选择文件上传时的问题
判断原始的fileName是否为null或“”,如果不是,才上传
if(fileName==null||fileName.trim().equals("")){
continue;
}
过滤器:
一、编写过滤器的步骤
1、编写一个类,实现Filter接口
2、在web.xml中配置过滤器,决定要拦截的资源
二、过滤器的常见应用
1、通过条件判断,决定是否让目标资源执行
2、目标资源执行前,可以对request对象进行预处理
3、目标资源执行后,可以对response对象进行处理
三、多个过滤器的过滤顺序是按照filter-mapping的配置顺序定的
增强Response的功能
public class MyResponseWrapper extends HttpServletResponseWrapper {
private HttpServletResponse response;
private PrintWriter pw;
private ByteArrayOutputStream baos = new ByteArrayOutputStream();
public MyResponseWrapper(HttpServletResponse response) {
super(response);
this.response = response;
}
public byte[] getBuffer() {
if (pw != null) {
pw.close();
}
if (baos != null) {
try {
baos.flush();
return baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOutputStream();
}
@Override
public PrintWriter getWriter() throws IOException {
pw = new PrintWriter(new OutputStreamWriter(baos, response
.getCharacterEncoding()));
return pw;
}
class MyServletOutputStream extends ServletOutputStream {
@Override
public void write(int b) throws IOException {
baos.write(b);
}
}
}
对数据进行压缩
arg2.doFilter(request, myResponse);
byte[] buf=myResponse.getBuffer();
System.out.println("压缩前的数据大小:"+buf.length);
GZIPOutputStream gout= new GZIPOutputStream(out);
gout.write(buf);
gout.close();
byte[] bg= out.toByteArray();
System.out.println("压缩后的数据大小:"+bg.length);
response.setContentLength(bg.length);
response.setHeader("Content-Encoding", "gzip");
response.getOutputStream().write(bg);
JavaMail邮件开发
1、搭建环境
mail.jar
jaf:activation.jar(可选的,jdk1.6+则不需要该包)
2、主要的类或接口
Session:接收和发送邮件
getStore() :用于接收邮件
getTransport() :用于发送邮件
MimeMessage:代表一封邮件
邮件的内容是使用MIME协议进行描述的
MimeBodyPart:代表邮件中的某一部分
MimeMultipart:描述各部分之间的关系
封装到MimeMessage中,一封邮件就诞生了
3、若不描述body之间的关系,那么图片即会显示,也会被作为附件出现
4.将session交给tomcat管理时,要将mail.jar加入到tomcat的lib目标下,并将应用中的mail.jar删除
Properties prop= new Properties();
prop.setProperty("mail.host", "smtp.sina.cn");
prop.setProperty("mail.transport.protocol", "smtp");
Session session= Session.getInstance(prop);
//开启debug模式可以查看邮件发送的整个过程
session.setDebug(true);
try {
Transport tr=session.getTransport();
tr.connect("tiandiren2007", "13183485");
MimeMessage message= new MimeMessage(session);
message.setFrom(new InternetAddress("tiandiren2007@sina.cn"));
message.setRecipient(RecipientType.TO, new InternetAddress("tiandiren2007@yeah.net"));
message.setSubject("这是一封邀请函");
MimeBodyPart text= new MimeBodyPart();
text.setContent("你好<img src='cid:aa'/>中国", "text/html;charset=UTF-8");
//解决正文乱码
MimeBodyPart img= new MimeBodyPart();
DataHandler dh= new DataHandler(new FileDataSource("d:\\1.JPG"));
img.setDataHandler(dh);
img.setContentID("aa");
img.setFileName(MimeUtility.encodeText(dh.getName()));
MimeBodyPart attchment= new MimeBodyPart();
DataHandler db= new DataHandler(new FileDataSource("d:\\xp.txt"));
attchment.setDataHandler(db);
attchment.setFileName(MimeUtility.encodeText(db.getName()));// 解决文件名中文乱码
MimeMultipart mt= new MimeMultipart();
mt.addBodyPart(text);
mt.addBodyPart(img);
mt.setSubType("related");
MimeBodyPart content= new MimeBodyPart();
content.setContent(mt);
MimeMultipart mtt= new MimeMultipart();
mtt.addBodyPart(content);
mtt.addBodyPart(attchment);
mtt.setSubType("mixed");
message.setContent(mtt);
message.saveChanges();
// message.writeTo(new FileOutputStream("d:\\1.eml"));
tr.sendMessage(message, message.getAllRecipients());
tr.close();
} catch (Exception e) {
e.printStackTrace();
}
}
下载中文名乱码:response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(realFileName, "UTF-8"));
- 文件上传---文件上传
- 上传文件
- 文件上传
- 上传文件
- 文件上传
- 文件上传
- 上传文件
- 上传文件
- 文件上传
- 文件上传
- 文件上传
- 文件上传
- 文件上传
- 文件上传
- 文件上传
- 上传文件
- 文件上传
- 文件上传
- usb-skeleton.c 之 05-- struct usb-skel 赏析
- android 程序中运行main方法
- js代码加密
- 归并排序
- 我的vim和emacs配置文件(2014-05-19更新)
- 文件上传
- Android[高级教程] 设计模式之九 命令模式
- 54点提高PHP编程效率 引入缓存机制提升性能
- android:installLocation="preferExternal"的意义
- ubuntu 配置文件揭秘
- usb-skeleton.c 之 06-- 中间的contain_of()
- 金融产品
- Android虚拟补丁能否阻挡Android恶意软件攻击
- Android开发之旅:环境搭建及HelloWorld