【Javaweb】【commons-io】简单实现文件上传和邮件发送

文件上传


环境准备

Apache Commons FileUpload

Apache Commons IO

准备这两个jar包。导入项目中。

文件上传注意事项

  1. 为了保证服务器安全,上传的文件应该放在外界无法直接访问的目录下,比如WEB-INF
  2. 为了避免上传文件时产生文件覆盖,要为每一个上传的文件产生一个唯一的文件名
  3. 需要限制上传文件的最大值
  4. 可以限制上传的文件类型。在收到上传文件的文件名之后,判断文件的后缀名

代码实现

package com.zhong.servlet;

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

@WebServlet(name = "file.do")
public class FileServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String msg = null;

        //判断表单是普通表单还是带上传文件的表单
        if (!ServletFileUpload.isMultipartContent(request)) {
            return;
        }

        //创建文件上传的路径,这里为了避免直接从外部访问到上传目录,所有把上传目录放在了web-inf下
        String realPath = this.getServletContext().getRealPath("/WEB-INF/upload");
        File realFile = new File(realPath);
        if (!realFile.exists()) {
            realFile.mkdir();
        }

        //缓存,把超过了预期大小的文件放在一个临时的目录里。超过预期时间就删除掉,或者提醒用户转存为永久文件
        String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp");
        File tmpFile = new File(tmpPath);
        if (!tmpFile.exists()) {
            tmpFile.mkdir();
        }

        //创建DiskFileItemFactory上传对象,处理文件上传路径和上传大小
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        //设置它的缓冲区也就是它本身的临时文件区,以下两句可以不用写,因为它本身有默认值
        diskFileItemFactory.setSizeThreshold(1024 * 1024);//1M
        diskFileItemFactory.setRepository(tmpFile);//临时文件保存区,参数是一个file对象’

        //创建ServletFileUpload
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);

        //创建文件上传进度监听器
        servletFileUpload.setProgressListener(new ProgressListener() {
            @Override
            //pBytesRead : 已上传文件大小
            //pContentLength : 总文件大小
            public void update(long pBytesRead, long pContentLength, int pItems) {
                System.out.println("总大小:"+pContentLength+"已上传:"+pBytesRead);
            }
        });

        //处理乱码
        servletFileUpload.setHeaderEncoding("UTF-8");
        //设置单个文件的最大值
        servletFileUpload.setFileSizeMax(1024*1024*10);
        //设置总共能够上传的文件大小
        servletFileUpload.setSizeMax(1024*1024*10);



        //处理上传的文件
        try {
            //解析前端请求,封装成FileItem对象,需要从servletFileUpload中获取携带参数request
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);
            for (FileItem fileItem : fileItems) {
                //判断上传的文件是普通表单还是文件表单
                if (fileItem.isFormField()) {
                    //获得前端控件中的name
                    String name = fileItem.getFieldName();
                    String value = fileItem.getString("UTF-8");//处理乱码
                    System.out.println(name + ":" + value);//后台日志输出
                }else {//如果是文件表单
                    String name = fileItem.getName();
                    //处理不合法文件名
                    if (name.trim().equals("")||name==null) {
                        continue;
                    }
                    //获得上传的文件名
                    String fileName = name.substring(name.lastIndexOf("/") + 1);
                    //获得文件的后缀名
                    String fileExtName = name.substring(name.lastIndexOf(".") + 1);

                    //可以使用UUID来生成唯一的识别码来作为文件名
                    //UUID实现了序列化接口,这是由于网络传输中的东西都需要被序列化
                    String uuid = UUID.randomUUID().toString();

                    //文件存放路径
                    String realPath1 = realFile+"/"+uuid;
                    //给每个文件创建一个对应的文件夹
                    File realPathFile = new File(realPath1);
                    if (realPathFile.exists()) {
                        realPathFile.mkdir();
                    }

                    //文件传输部分
                    //获得文件上传的流
                    InputStream inputStream = fileItem.getInputStream();

                    //创建一个文件输出的流
                    FileOutputStream fileOutputStream = new FileOutputStream(realPath1 + "/" + fileName);

                    //创建缓冲区
                    byte[] buffer = new byte[1024*1024];

                    //判断是否读取完毕
                    int len = 0;
                    //判断是否大于0,大于0说明还有数据
                    while ((len=inputStream.read(buffer))>0) {
                        fileOutputStream.write(buffer,0,len);
                    }
                    fileOutputStream.close();
                    inputStream.close();

                    msg = "文件上传成功";
                    fileItem.delete();//清除临时文件




                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        request.setAttribute("msg",msg);


    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

邮件发送


环境准备

JavaBeans™ Activation Framework

JavaMail API (compat)

简单邮件

package com.zhong;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;

public class Maildemo01 {

    public static void main(String[] args) throws GeneralSecurityException, MessagingException {
        //配置
        Properties prop = new Properties();
        prop.setProperty("mail.host","smtp.qq.com");//设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol","smtp");//设置邮件发送协议
        prop.setProperty("mail.smtp.auth","true");//需要验证用户名和密码

        //QQ邮箱还需要加上SSL加密
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable",true);
        prop.put("mail.smtp.ssl.socketFactory",sf);

        //1.创建定义整个应用程序需要的环境信息session对象、

        //QQ邮箱需要,其他邮箱不用
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人的用户名和授权码
                return new PasswordAuthentication("992683167@qq.com","jktlqktssfdobcgd");
            }
        });

        //开启Session的debug模式,查看程序发送Email的运行状态
        session.setDebug(true);

        //2.通过session获得transport对象
        Transport transport = session.getTransport();

        //3.使用邮箱用户名和授权码连接上邮件服务器
        transport.connect("smtp.qq.com","992683167@qq.com","jktlqktssfdobcgd");

        //4.创建邮件
        MimeMessage message = new MimeMessage(session);

        //指明邮件的发件人
        message.setFrom(new InternetAddress("992683167@qq.com"));

        //指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("992683167@qq.com"));

        //邮件的标题
        message.setSubject("纯文本邮件");

        //邮件正文
        message.setContent("hello,world!","text/html;charset=utf-8");

        //5.发送邮件
        transport.sendMessage(message, message.getAllRecipients());

        //关闭连接
        transport.close();


    }
}

图片邮件

package com.zhong;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.security.GeneralSecurityException;
import java.util.Properties;

public class Maildemo01 {

    public static void main(String[] args) throws GeneralSecurityException, MessagingException {
        //配置
        Properties prop = new Properties();
        prop.setProperty("mail.host","smtp.qq.com");//设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol","smtp");//设置邮件发送协议
        prop.setProperty("mail.smtp.auth","true");//需要验证用户名和密码

        //QQ邮箱还需要加上SSL加密
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable",true);
        prop.put("mail.smtp.ssl.socketFactory",sf);

        //1.创建定义整个应用程序需要的环境信息session对象、

        //QQ邮箱需要,其他邮箱不用
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人的用户名和授权码
                return new PasswordAuthentication("992683167@qq.com","jktlqktssfdobcgd");
            }
        });

        //开启Session的debug模式,查看程序发送Email的运行状态
        session.setDebug(true);

        //2.通过session获得transport对象
        Transport transport = session.getTransport();

        //3.使用邮箱用户名和授权码连接上邮件服务器
        transport.connect("smtp.qq.com","992683167@qq.com","jktlqktssfdobcgd");

        //4.创建邮件
        MimeMessage message = new MimeMessage(session);

        //指明邮件的发件人
        message.setFrom(new InternetAddress("992683167@qq.com"));

        //指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("992683167@qq.com"));

        //邮件的标题
        message.setSubject("纯文本邮件");

        /*简单邮件
        //邮件正文
        message.setContent("hello,world!","text/html;charset=utf-8");
        */

        /**
         * 复杂邮件
         * */
        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理
        DataHandler dataHandler = new DataHandler(new FileDataSource("E:\\壁纸\\1.png"));
        image.setDataHandler(dataHandler);//在image中放入数据化的图片
        image.setContentID("1.png");//设置图片id,方便后面使用

        //
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("图片<img src='cid:1.png'>邮件", "text/html;charset=utf-8");

        //描述数据关系
        MimeMultipart mimeMultipart = new MimeMultipart();
        mimeMultipart.addBodyPart(text);
        mimeMultipart.addBodyPart(image);
        mimeMultipart.setSubType("related");

        //设置到消息中保存修改
        message.setContent(mimeMultipart);
        message.saveChanges();


        //5.发送邮件
        transport.sendMessage(message, message.getAllRecipients());

        //关闭连接
        transport.close();


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值