JavaWeb-20 (JDBC之文件上下传与JavaMail)

JavaWeb-20

JAVAWEB-20:JDBC之文件上下传与JavaMail

补充过滤器

<filter-mapping>可以加入<dispatcher>的配置
    1、默认不写:REQUEST
    2、其他取值
        a.ERROR:过滤web.xml中的错误页
        b.INCLUDE:动态包含的资源
        c.FORWARD:转发的资源

        在过滤类型<filter-mapping>内加上标签<dispatcher>
        加上配置值。注意每一个配置值的作用

        在index里加上跳转标签,跳转到01.jsp
        注意过滤器对01.jsp没有进行拦截!!这是默认的状态
        如果想起作用,在<dispatcher>里加上FORWARD的属性值。

        在<dispatcher>里加上了INCLUDE的属性后
        使用include标签演示,使用静态包含的话,不会拦截
        但是如果是动态包含的话就会拦截

        在声明头加上errorPage加上属性值01.jsp
        如果在<dispatcher>上加上ERROR的话,那么errorPage就不会走
        如果想走,就配置FORWARD。

        如果把errorPage删去
        而在xml里加上<error-page>,并在里面加属性<exception-type><location>等属性,那么可以配置FORWARD属性来启动这些标签。

        这些属性都可以同时用。

一、文件上传的原理及框架的引入

1、上传的必要性:博客等例子

2、上传的前提

1、enctype = "multipart/form-data"
2、method="post"
3、<input type = "file"/>

   <form enctype="multipart/form-data" action="${pageContext.request.contextPath}/servlet/FileUploadServlet1" method="post">
        靓照0:<input type="file" name="f1"><br>
        靓照1:<input type="file" name="f2"><br><!--名称可以相同-->
        <input type="submit" value="上传"><br>

    </form>

以上是准备工作

尝试上传关键组件

        1、环境编码
        2、获取f1的值,尝试打印发现什么都没有,null

为什么?注意getParameter只针对enctype里的值:application/x-www-form-urlencoded

文件上传的原理:利用Record来记录上传的内容 观察:

Content-Type: multipart/form-data; boundary=---------------------------7de2192e140922
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 971
DNT: 1
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=D8C093F784D359A1395BF097CD6E8B9A

-----------------------------7de2192e140922
Content-Disposition: form-data; name="f1"; filename="oracleinfo.txt"
Content-Type: text/plain

Enterprise Manager Database Control URL - (orcl2) :http://wangli-PC:1158/em数据库配置文件已经安装到 D:\oracle\product\10.2.0,同时其他选定的安装组件也已经安装到 D:\oracle\product\10.2.0\db_3。iSQL*Plus URL 为:http://wangli-PC:5560/isqlplusiSQL*Plus DBA URL 为:http://wangli-PC:5560/isqlplus/dba

^list\[\d+\]\.name
-----------------------------7de2192e140922
Content-Disposition: form-data; name="f2"; filename="oracleinfo.txt"
Content-Type: text/plain

Enterprise Manager Database Control URL - (orcl2) :http://wangli-PC:1158/em数据库配置文件已经安装到 D:\oracle\product\10.2.0,同时其他选定的安装组件也已经安装到 D:\oracle\product\10.2.0\db_3。iSQL*Plus URL 为:http://wangli-PC:5560/isqlplusiSQL*Plus DBA URL 为:http://wangli-PC:5560/isqlplus/dba

^list\[\d+\]\.name
-----------------------------7de2192e140922--

                通过边界-----------------------------7de2192e140922--来把上传的文件给隔开。

        文件上传原理
        InputStream is = request.getInputStream();
        byte []buffer = new byte[1024];
        int len=-1;
        while((len=is.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }

实验:项目:day2001fileupload1

项目架构:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="http://blog.163.com/faith_yee/blog/<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->
  </head>
  <!-- 文件上传的三个前提条件:
    1.enctype="multipart/form-data"
    2.method="post"
    3.必须有<input type="file" name="f1">
   -->
  <body>
    <form enctype="multipart/form-data" action="${pageContext.request.contextPath }/servlet/FileUploadServlet3" method="post">
        姓名:<input type="text" name="username"/><br>
        靓照1:<input type="file" name="f1"><br>
        靓照2:<input type="file" name="f2"><br><!-- 名称可以相同 -->
        <input type="submit" value="上传"/><br>
    </form>
  </body>
</html>

01.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
      </head>
  <body>
    <%
      Runtime.getRuntime().exec("notepad");
     %>
  </body>
</html>

FileUploadServlet1.java

package com.itheima.servlet;

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileUploadServlet1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //注意:getParameter()方法只针对enctype="application/x-www-form-urlencoded"起作用 ,对于multipart/form-data无效
        /*String f1 = request.getParameter("f1");
        System.out.println(f1);*/

        //文件上传原理
        InputStream is = request.getInputStream();//这是文件上传的原理
        byte []buffer = new byte[1024];
        int len=-1;
        while((len=is.read(buffer))!=-1){
            System.out.println(new String(buffer,0,len));
        }

        /*Content-Type: multipart/form-data; boundary=---------------------------7de2192e140922
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 971
DNT: 1
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=D8C093F784D359A1395BF097CD6E8B9A

-----------------------------7de2192e140922
Content-Disposition: form-data; name="f1"; filename="oracleinfo.txt"
Content-Type: text/plain

Enterprise Manager Database Control URL - (orcl2) :http://wangli-PC:1158/em数据库配置文件已经安装到 D:\oracle\product\10.2.0,同时其他选定的安装组件也已经安装到 D:\oracle\product\10.2.0\db_3。iSQL*Plus URL 为:http://wangli-PC:5560/isqlplusiSQL*Plus DBA URL 为:http://wangli-PC:5560/isqlplus/dba

^list\[\d+\]\.name
-----------------------------7de2192e140922
Content-Disposition: form-data; name="f2"; filename="oracleinfo.txt"
Content-Type: text/plain

Enterprise Manager Database Control URL - (orcl2) :http://wangli-PC:1158/em数据库配置文件已经安装到 D:\oracle\product\10.2.0,同时其他选定的安装组件也已经安装到 D:\oracle\product\10.2.0\db_3。iSQL*Plus URL 为:http://wangli-PC:5560/isqlplusiSQL*Plus DBA URL 为:http://wangli-PC:5560/isqlplus/dba

^list\[\d+\]\.name
-----------------------------7de2192e140922--
*/

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

测试1:

测试2:

关于我们客户端上传到服务器时的信息,解析的工作已经有公司给我们做好了框架,我们直接用好了:SmartUpload、commons-FileUpload(主讲)

要使用的时候也需要前提准备工作

3、当表单提交数据时,

enctype="application/x-www-form-urlencoded",它是默认值,此时服务器可以用request.getParameter()取数据,否则不能取数据必须把form的enctype属值设为multipart/form-data.设置该值后,浏览器在上传文件时,将把文件数据附带在http请求消息体中,并使用MIME协议对上传的文件进行描述,以方便接收方对上传数据进行解析和处理。

创建页面

    如果表单的提交类型为multipart/form-data,那么表单的数据将不能通过传统方式获得。如何获得:

4、接收客户端数据并引入上传框架

5、框架的使用

1、介绍SmartUpload  好用,但已经不更新了
2、Commons-FileUpload(主讲)

6、commons-fileupload框架的使用

1、导2个jar包
    commons-fileupload-xxx.jar
    commons-io-xxx.jar

    怎么用框架呢?

2、文件上传的步骤

    1、设置文件上传所保存的文件夹
    file.mkdirs();//和mkdir()的区别是s可以创建多级目录
    2、判断是否为enctype=enctype="multipart/form-data" 

    3、生成文件上传对象
    在文档里拷贝代码(开源上传文件框架)
    4、通过文件上传对象,转化用户请求,以得到文件域中的值对象

    5、遍历各文件域对象,再取值
    另外:在上传文本框上输入文字不出现乱码

    普通字段中文值:FileItem.getString("UTF-8");
    遍历中加上else语句去判断上传字段的各种情况/或者用来限制上传的文件类型,文件名的路径也可能产生问题,加上解决代码

    出现同名问题:
    总之:在遍历的过程中考虑服务器会出现的9个问题的解决方法!!

    以上步骤写入服务器硬盘时用到了IOUtils的便捷功能。

FileUploadServlet2.java

package com.itheima.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

public class FileUploadServlet2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        //文件上传的步骤
        //1.设置文件上传所保存的文件夹
        String storePath = getServletContext().getRealPath("/files");
        File file = new File(storePath);
        if(!file.exists()){
            //如果文件夹不存在,就调用 DOS命令创建文件夹
            file.mkdirs();//可以创建多级目录
        }
        //2.判断是否为enctype="multipart/form-data"
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if(!isMultipart){
            //不是enctype="multipart/form-data"
            response.getWriter().write("你有病 ,没脑子,刚说了enctype=multipart/form-data,2秒后请重新上传");
            response.setHeader("Refresh", "2;URL="+request.getContextPath());
            return;
        }
        //3.生成文件上传对象
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        //4.通过文件上传对象,转化用户请求,以得到各文件域的值对象
        List<FileItem> items =null;
        try {
            items = upload.parseRequest(request);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        //5.遍历各文件域对象,再取值
        for(FileItem item :items){
            if(item.isFormField()){
                //这是普通字段
                String name = item.getFieldName();//取框的name属性
                String value = item.getString();//取框的值
                System.out.println(name+","+value);
            }else{
                //文件上传字段  <input type="file>
                String fileName = item.getName();//  C:\Users\wangli\Desktop\Hib二级缓存.txt  注意有些浏览器只有文件名没有路径
                String trueFileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);

                //得到上传的文件内容
                InputStream is = item.getInputStream();
                OutputStream os = new FileOutputStream(storePath+File.separator+trueFileName);

                IOUtils.copy(is, os);
                os.close();
                is.close();
            }
        }
        response.getWriter().write("文件上传成功!");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

测试1:

测试2:

测试3:

测试4:

7、文件上传的9个问题

1、如何保证服务器的安全

在01.jsp里加入一些关键性代码:操作服务器的dos控制台
解决:把保存文件的目录放在WEB-INF目录下,因为tomcat服务器的这个目录不对外开放。

2、临时文件夹的问题

FileUploadServlet3里设置临时文件夹。

测试:在index.jsp里的目的地走FileUploadServlet3上传东西(大一些的文件);然后在临时文件夹里查看

当上传完了,temp的文件还没有去除掉。可以在代码里去添加
//用于删除上传中产生的临时文件
item.delete();

3、如果上传的文件是中文名怎么办?

a.中文的文件名:request.setCharacterEncoding("UTF-8");//专门用于解决上传文件的文件名是中文的情况。

另外:在上传文本框上输入文字不出现乱码

b.普通字段中文值:FileItem.getString("UTF-8");

4、防止同一个文件夹的文件重名

如果不处理--->导致文件被覆盖
给文件名+UUID
在FileUploadServlet3里加上代码

5、文件夹的内容过多

在FileUploadServlet3里加上代码
    a、按时间分类
    b、引入hashCode码实现生成子文件夹

测试时注意serlvet里的代码重载来测试!!!!

6、上传文件的大小

继续在FileUploadServlet3里加上代码测试

测试会在服务器里提示客户端的错误操作。服务器正常运行。

7、限制上传文件的类型

判断文件的MIME类型:image/jpg  text/html   ....

继续在FileUploadServlet3里加上代码测试

8、多文件上传时,用户没传全

防止一些文件域没有上传文件:

9、文件上传进度条:异步与服务器进行通信,间隔性的通信

加入监听上传文件的进度:代码

直接调用jar包的监听器

实现进度条(课下兴趣)

FileUploadServlet3.java

package com.itheima.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

public class FileUploadServlet3 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");//专门用于解决上传文件的文件名为中文的情况
        response.setContentType("text/html;charset=UTF-8");

        //文件上传的步骤
        //1.设置文件上传所保存的文件夹
        String storePath = getServletContext().getRealPath("/WEB-INF/files");
        File file = new File(storePath);
        if(!file.exists()){
            //如果文件夹不存在,就调用 DOS命令创建文件夹
            file.mkdirs();//可以创建多级目录
        }

        //2.判断是否为enctype="multipart/form-data"
                boolean isMultipart = ServletFileUpload.isMultipartContent(request);
                if(!isMultipart){
                    //不是enctype="multipart/form-data"
                    response.getWriter().write("你有病 ,没脑子,刚说了enctype=multipart/form-data,2秒后请重新上传");
                    response.setHeader("Refresh", "2;URL="+request.getContextPath());
                    return;
                }
        //3.生成文件上传对象
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setRepository(new File("e:/h47"));//设置临时文件保存的文件夹
            factory.setSizeThreshold(50*1024*1024);//50M

            ServletFileUpload upload = new ServletFileUpload(factory);

            //监听上传文件的进度
            /*upload.setProgressListener(new ProgressListener() {

                public void update(long readed, long length, int arg2) {
                    System.out.println("当前上传的进度:"+readed*1.0/length);

                }
            });*/

            //限制上传文件的大小
            /*upload.setFileSizeMax(2*1024*1024);//单个文件大小
            upload.setSizeMax(3*1024*1024);//总文件大小
*/
            //4.通过文件上传对象,转化用户请求,以得到各文件域的值对象
            List<FileItem> items =null;
            try {
                items = upload.parseRequest(request);
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
            //5.遍历各文件域对象,再取值
            for(FileItem item :items){
                if(item.isFormField()){
                    //这是普通字段
                    String name = item.getFieldName();//取框的name属性
                    String value = item.getString("UTF-8");//取框的值  代表文本框的值没有乱码
                    System.out.println(name+","+value);
                }else{
                    String mimetype = item.getContentType();//MIME类型   image/jpg   text/html  text/js  text/css
                    if("".equals(item.getName())){
                        continue;//防止一些文件域没有上传文件
                    }
                    //if(mimetype.contains("image")){
                        try {
                            //文件上传字段  <input type="file>
                            String fileName = item.getName();   //  C:\Users\wangli\Desktop\Hib二级缓存.txt  注意有些浏览器只有文件名没有路径
                            String trueFileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);
                            String uuidTrueFileName = UUID.randomUUID().toString()+"_"+trueFileName;
                            //得到上传的文件内容
                            InputStream is = item.getInputStream();

                            //加入子文件夹,避免一个文件夹下文件过多的问题
                            String path = createDir(storePath,uuidTrueFileName);
                            OutputStream os = new FileOutputStream(storePath+File.separator+path+File.separator+uuidTrueFileName);

                            IOUtils.copy(is, os);

                            //用于删除上传过程中,所产生的临时文件

                            os.close();
                            is.close();
                            item.delete();
                        } catch (Exception e) {
                            e.printStackTrace();
                            response.getWriter().write("文件上传失败");
                        }
                    /*}
                    else{
                    //  response.getWriter().write("上传文件类型不匹配");
                    }*/

                }
            }

            response.getWriter().write("文件上传成功!");
    }

    //按时间区分
    public String createDir(String storePath){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        String path = sdf.format(new Date());
        File file = new File(storePath,path);
        if(!file.exists()){
            file.mkdirs();
        }
        return path;
    }
    //1010 0000 1111 0000 1010 0001
    //0000 0000 0000 0000 0000 1111     &0xf
    //0000 0000 0000 0000 0000 0001  ---------------->(0-15)

    //1010 0000 1111 0000 1010 0001
    //0000 0000 0000 0000 1111 0000   0xf0
    //0000 0000 0000 0000 1010 0000   >>4
    //0000 0000 0000 0000 0000 1010   --------------->(0-15)   两级目录,共有16*16=256个文件夹
    //引入hashCode码实现生成子文件夹
    public String createDir(String storePath,String fileName){
        int code = fileName.hashCode();
        int dir1=code&0xf;//按位与
        int dir2= (code & 0xf0)>>4;//先进行位与,再进行右移4位
        String path = dir1+File.separator+dir2;
        File file = new File(storePath,path);
        if(!file.exists()){
            file.mkdirs();
        }
        return path;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);
    }

}

解释问题1:

解释问题2:

解释问题3:

解释问题4:

解释问题5:

解释问题6:

解释问题7:

解释问题8:

解释问题9:

解释问题10:

解释问题11:

二、文件下载功能演示

实验:项目:day2002download

项目架构:

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title>上传</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="http://blog.163.com/faith_yee/blog/styles.css">
    -->
  </head>

  <body>
    <form action="${pageContext.request.contextPath}/servlet/UploadServlet1" enctype="multipart/form-data" method="post">
        用户名:<input type="text" name="name"/><br/>
        靓照1:<input type="file" name="f1"/><br/>
        靓照2:<input type="file" name="f2"/><br/>
        <input type="submit" value="保存"/>
    </form>
  </body>
</html>

listFile.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

    <title></title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    

  </head>

  <body>
    <a href="http://blog.163.com/faith_yee/blog/${pageContext.request.contextPath}/index.jsp">继续上传</a>
    <hr/>
    <c:forEach items="${map}" var="me">
        <c:url value="/servlet/DownloadServlet" var="url">
            <c:param name="filename" value="${me.key}"></c:param>
        </c:url>
        ${me.value}&nbsp;&nbsp;<a href="http://blog.163.com/faith_yee/blog/${url}">下载</a><br/>
    </c:forEach>
  </body>
</html>

UploadServlet1.java

package com.itheima.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

public class UploadServlet1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");//只能处理中文文件名
        //1.要保证文件夹存在
        String storePath = getServletContext().getRealPath("/WEB-INF/files");
        File file = new File(storePath);
        if(!file.exists()){
            file.mkdirs();
        }
        //2.判断是否为enctype="multipart/form-data"
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if(!isMultipart){
            response.getWriter().write("2秒重新上传");
            response.setHeader("Refresh", "2;URL="+request.getContextPath());
            return;
        }
        //3.生成文件上传 对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);

        //4.转化请求类型,得到List<FileItem>
        try {
            List<FileItem> list = upload.parseRequest(request);

            //5.遍历
            for(FileItem item:list){
                if(item.isFormField()){
                    String name = item.getFieldName();
                    String value = item.getString("UTF-8");
                    System.out.println(name+":"+value);
                }else{
                    //上传字段
                    if("".equals(item.getName())){
                        continue;
                    }
                    String mime = item.getContentType();
                    if(mime.contains("image")){
                        String fileName = item.getName();
                        fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);

                        String trueFileName = UUID.randomUUID().toString()+"_"+fileName;

                        //防一个文件夹下文件过多
                        String path = createDir(storePath,trueFileName);

                        //得到输入流
                        InputStream is = item.getInputStream();
                        OutputStream os = new FileOutputStream(storePath+File.separator+path+File.separator+trueFileName);

                        IOUtils.copy(is, os);

                        //关流
                        os.close();
                        is.close();
                        item.delete();//删除临时文件
                    }
                }
            }
            //response.getWriter().write("文件上传成功");
            //上传成功后直接进入查询文件列表的Servlet
            request.getRequestDispatcher("/servlet/ListFilesServlet").forward(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String createDir(String storePath,String fileName){
        int code = fileName.hashCode();
        int dir1=code&0xf;
        int dir2 = (code&0xf0)>>4;
        String path = dir1+File.separator+dir2;
        File file = new File(storePath,path);
        if(!file.exists()){
            file.mkdirs();
        }
        return path;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

ListFilesServlet.java

package com.itheima.servlet;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ListFilesServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1.找到WEB-INF/files的目录
        String storepath = getServletContext().getRealPath("/WEB-INF/files");

        //2.要生成一个Map集合,用于存储递归遍历过程中得到文件(key:UUID_文件名,value:原来的文件名)
        Map<String,String> map = new HashMap<String,String>();

        //3.递归得到文件名
        treeWalk(new File(storepath),map);

        //4.保存到request域
        request.setAttribute("map", map);

        //5.转发
        request.getRequestDispatcher("/listFiles.jsp").forward(request, response);
    }

    //递归遍历文件夹
    private void treeWalk(File file, Map<String, String> map) {
        if(file.isFile()){
            String fileName = file.getName();//得到文件名  UUID_文件名
            String oldFileName = fileName.split("_")[1];//得到原始文件名
            map.put(fileName, oldFileName);
        }else{
            File [] childFiles = file.listFiles();//列举出当前文件夹下的所有文件及子文件夹
            for(File childFile: childFiles){
                treeWalk(childFile,map);
            }
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

DownloadServlet.java

package com.itheima.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

public class DownloadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        //1.取参数
        String fileName = request.getParameter("filename");
        fileName= new String(fileName.getBytes("iso-8859-1"),"UTF-8");

        //得到原始文件名
        String oldFileName = fileName.split("_")[1];
        //2.
        //2.1.找到WEB-INF/files的目录
        String storepath = getServletContext().getRealPath("/WEB-INF/files");
        //2.2找这个文件的原始路径
        String path = createDir(storepath,fileName);

        //3.得到真正的文件的文件流     /WEB-INF/files/1/0/fdsfdsfsdfdsfs_a.jpg
        InputStream is = new FileInputStream(storepath+File.separator+path+File.separator+fileName);

        //4.设置响应头
        response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(oldFileName,"UTF-8"));
        //5.下载
        OutputStream os =response.getOutputStream();
        IOUtils.copy(is, os);

        is.close();

        os.write(("文件下载成功!<a href=‘http://blog.163.com/faith_yee/blog/"+request.getContextPath()+"/servlet/ListFilesServlet‘>继续下载</a>").getBytes("UTF-8"));

    }
    public String createDir(String storePath,String fileName){
        int code = fileName.hashCode();
        int dir1=code&0xf;
        int dir2 = (code&0xf0)>>4;
        String path = dir1+File.separator+dir2;

        return path;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doGet(request, response);

    }

}

上传文件:

列出服务器接收的文件:

点击下载文件:

在服务器上记录上传的用户名:

UploadServlet1.java:演示文件上传代码

在代码里加入上传成功后查询所有文件列表

ListFilesServlet.java:把上传到服务器的文件展示出来的servlet:ListFileServlet:用来获得文件列表并存储在map中提供给listFile.jsp去获取文件然后提供给用户下载,之后会提供链接跳到另外一个servlet去处理用户的下载。

1、找到WEB-INF/files的目录
String storepath = getSetvletContext().getRealPath("/WEB-INF/files");

    1.1得到原始文件名
2、要生成一个Map集合,用于存储递归遍历过程中得到的文件(Key:UUID_文件名,value:原来的文件名)
Map <String ,String> map = new HashMap<String , String>();
3、递归得到文件名
treeWalk(new File(storepath),map);//创建这个函数,找到了文件夹然后把内容保存在了Map集合中了
4、保存到request域中
request.setAttribute("map",map);

5、转发--->listFile.jsp
真实从服务器下载的是UUID文件名的文件,即从key中拿内容,和给用户的文件名是从map的value中拿取。

//递归遍历文件夹
填充treeWalk()函数。
 递归文件夹

DownloadServlet.java:处理map中的文件给用户下载

1、取参数--->拿到文件名

2、找这个文件的原始路径,使用createDir()
    2.1、找到WEB-INF/files的目录
    2.2、找这个文件的原始路径

3、得到真正的文件的文件流

4、设置响应头

5、下载

三、邮件发送接收原理

练习:手工发送一封邮件(熟悉SMTP协议) 准备:

[email protected] iamsorry

itheimacloud     aXRoZWltYWNsb3Vk
iamsorry    aWFtc29ycnk=

smtp.163.com
pop.163.com

开始发送:
telnet smtp.163.com 25
---------------------------------以下属于SMTP协议的内容
ehlo wyj 加空格          向服务器打招呼

auth login             请求认证

aXRoZWltYWNsb3Vk

aWFtc29ycnk=

mail from:<[email protected]>
rcpt to:<[email protected]>

data               标识邮件内容开始(内容需要遵守一定的格式:RFC822规范)
from:[email protected]
to:[email protected]
subject:this is test mail

aaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
.                   <CR><LF>.代表结束
----------------------------------
quit

邮件账号:

dos输入代码:

收到邮件

四、使用JavaMail (熟悉就好,面试少)

目标:注册成功后发送一封激活邮件,可以进行激活用户

JavaMail API:规范  ()
依赖两jar包
jaf-1_1_1.zip
javamail1_4_4.zip

实验:项目:day2003mail

项目架构:

MailTest.java

package com.itheima.test;

import java.net.InetAddress;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            Properties p = new Properties();
            p.put("mail.transport.protocol", "smtp");
            p.put("mail.smtp.host", "smtp.163.com");

            Session session = Session.getInstance(p);
            session.setDebug(true);
            //2.得到Message
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress("[email protected]"));
            message.setRecipients(Message.RecipientType.TO, "[email protected]");
            message.setSubject("这是来自百合网的一个姑娘写来的邮件");
            message.setText("大哥,小妹今年18岁,未婚,。。。。。。。");

            //发送
            Transport tp = session.getTransport();
            tp.connect("itheimacloud", "iamsorry");
            tp.sendMessage(message, message.getAllRecipients());

            tp.close();
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }

}

输出结果:

DEBUG: setDebug: JavaMail version 1.4.4
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.163.com", port 25, isSSL false
220 163.com Anti-spam GT for Coremail System (163com[20121016])
DEBUG SMTP: connected to host "smtp.163.com", port: 25

EHLO yw
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFhzBbSUCa0xDrUUUUj
250-STARTTLS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN"
DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFhzBbSUCa0xDrUUUUj"
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
AUTH LOGIN
334 dXNlcm5hbWU6
aXRoZWltYWNsb3Vk
334 UGFzc3dvcmQ6
aWFtc29ycnk=
235 Authentication successful
DEBUG SMTP: use8bit false
MAIL FROM:<[email protected]>
250 Mail OK
RCPT TO:<[email protected]>
250 Mail OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   [email protected]
DATA
354 End data with <CR><LF>.<CR><LF>
From: [email protected]
To: [email protected]
Message-ID: <[email protected]>
Subject: =?GBK?B?1eLKx8C019Sw2brPzfi1xNK7uPa5w8Tv0LTAtLXE08q8/g==?=
MIME-Version: 1.0
Content-Type: text/plain; charset=GBK
Content-Transfer-Encoding: base64

tPO456Os0KHDw73xxOoxOMvqo6zOtLvpo6yho6GjoaOho6GjoaOhow==
.
250 Mail OK queued as smtp11,D8CowEA5IhKj0mBUDPN9AQ--.1352S2 1415631524
QUIT
221 Bye

收件成功:

资料下载

时间: 2024-11-02 13:30:46

JavaWeb-20 (JDBC之文件上下传与JavaMail)的相关文章

JavaWeb学习总结,文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

Javaweb学习笔记10—文件上传与下载

 今天来讲javaweb的第10阶段学习.文件的上传与下载,今天主要说的是这个功能的实现,不用说了,听名字就是外行人也知道肯定很重要啦. 老规矩,首先先用一张思维导图来展现今天的博客内容. ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,请点击下载 另外:如果图看不清的话请右击---在新窗口中打开会清楚很多 一*, 文件的上传:      1 *分析实现步骤: 1.1* 客户端浏览器通过文件域选择本地要上传的文件. * 点击"上传"按钮

JavaWeb 后端 &lt;十四&gt; 文件上传下载

1.文件上传与下载 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 1.1 文件上传 文件上传,要点: 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type=”file” /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型:enctype =”multipart/

javaweb学习总结(五)-文件上传

一.手动实现文件上传 1.指定表单类型为文件上传表单 2.提交方式必须为:POST <form enctype="multipart/form-data" method="post" action="${pageContext.request.ContextPath}/test"> 用户名:<input type="text" name="username"/>文件:<inpu

web day22 文件上传,下载,JavaMail

上传 (上传不能使用BaseServlet) 1. 上传对表单限制 *method="post" *enctype="multipart/form-data" * 表单中需要添加文件表单项:<inputtype="file" name="xxx" /> <form action="xxx"method="post" enctype="multipart/for

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

JavaWeb文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请 求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common- fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,st

JavaWeb项目实现文件上传动态显示进度

很久没有更新博客了,这段时间实在的忙的不可开交,项目马上就要上线了,要修补的东西太多了.当我在学习JavaWeb文件上传的时候,我就一直有一个疑问,网站上那些博客的图片是怎么上传的,因为当提交了表单之后网页就跳转了.后来我学习到了Ajax,我知道了浏览器可以异步的发送响应,这时我又有新的疑问,那就是在我上传一些文件的时候,那些网站的上传进度是怎么做到的,因为servlet直到上传完成之后才完成响应. 最近我们的项目中有一个地方中需要用到一个功能,当用户点击一个处理按钮时,前台会实时的显示后台处理

JavaWeb学习总结(五十)——文件上传和下载 http://www.cnblogs.com/xdp-gacl/p/4200090.html

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru