文件上传

来源:互联网 发布:华为沧州云计算 编辑:程序博客网 时间: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"));