jsp通过servlet使用commons包进行文件上传

package com.jsptest.action;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadFileAction extends HttpServlet{

	/**
	 * 文件上传,使用commons-fileupload-1.3.3.jar和commons-io-2.4.jar 两个包进行文件上传
	 */
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("UTF-8");
        //判断是否是一个多部分文件内容
        boolean isMultiPart = ServletFileUpload.isMultipartContent(req) ;
        //步骤1:完成文件夹的建立
        //步骤1-1:存储文件位置的文件夹
        //获取当前项目的绝对路径
        Date date = new Date() ;

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd") ;
        String strDate = sdf.format(date) ;

        String realPath = req.getSession().getServletContext().getRealPath("/upload" + "/" + strDate) ;
       
        File path = new File(realPath) ;

        //判断文件夹是否存在
        if(!path.exists()) {
            path.mkdirs() ;
        }

        //步骤1-2:设置临时文件夹的大小
        File fileTempDir = new File("fileDir") ;
        if(!fileTempDir.exists()) {
            fileTempDir.mkdirs() ;
        }

        //步骤2:需要判断是否是一个文件
        if(isMultiPart) {
            //步骤2-1:建立磁盘工厂
            DiskFileItemFactory factory = new DiskFileItemFactory() ;
            //设置临时缓冲区大小
            factory.setSizeThreshold(4096);
            //使用工厂设置临时目录
            factory.setRepository(fileTempDir);
            //使用servletFileUpload进行文件上传,将磁盘工厂放到servlet中,使用http协议进行文件的上传
            ServletFileUpload fileUpload = new ServletFileUpload(factory) ;
            //设置最大的上传文件大小
            fileUpload.setFileSizeMax(1024 * 1024 * 100);
            try {
                //步骤2-2:通过ServletUpload进行request的转换
                List<FileItem> fileItems =fileUpload.parseRequest(req);

                //将表单中的所有表单字段都返回为fileItem的集合,用于判断上传的是否是文件
                for(FileItem fileItem : fileItems) {
                    //不是一个字段,就是一个上传的文件
                    if(!fileItem.isFormField()) {
                        String fileName = fileItem.getName() ;
                        //获取文件名用途1:需要判断当前上传的文件是否使我们所允许上传的类型   1.mp3.txt.jpg
                        String ext = fileName.substring(fileName.lastIndexOf(".") + 1) ;

                        //System.out.println("==============ext==="+ext);
                        List<String> types = Arrays.asList("jpg","txt","png") ;
                        //如果需要打印types的结合 必须的将其转换为list集合的后才能进行使用
                        List<String > list=new ArrayList<String>(types);

//                        for (String type:list) {
//							System.out.println("types==="+type);
//						}
                        if(!list.contains(ext)) {
                            System.out.println("当前文件类型不允许上传!");
                        }
                        //获取文件名用途2:对上传的文件名进行重命名
                        String fileNewName = UUID.randomUUID().toString() ;

                        //保存文件
                        File newFile = new File(fileNewName + "." + ext) ;

                        //创建一个父路径realPath下的一个文件名为newFile.getName()的文件
                        File saveFile = new File(realPath,newFile.getName()) ;

                        //写出文件,使用流的形式进行文件的写出write(saveFile)此方法是fileItem内部的一个void类型的方法,主要适用于将文件进行写出到指定的文件夹下,并参删除临时文件夹
                        fileItem.write(saveFile);
                        
                        //拿到文件的句对路径
                        String fileRecPath = saveFile.getAbsoluteFile().toString() ;

                        //将该值放在数据库中存储,从当前文件夹下进行文件真实名称的截取
                        String fileNewPath = fileRecPath.substring(fileRecPath.indexOf("\\upload")) ;
                        System.out.println("==============fileNewPath==="+fileNewPath);
                        //将文件的真实路径放到setAttribute()中,发送到前端进行显示
                        req.setAttribute("filePath",fileNewPath);
                        

                    }else{
                        //判断当前运行的字段是哪一个字段,并且重新赋值
                        if("username".equals(fileItem.getFieldName())) {
                            String username = fileItem.getString() ;
                            System.out.println("username = " + username);
                        }

                    }


                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        req.getRequestDispatcher("/index1.jsp").forward(req,resp);

    }
		
	
}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
    <!-- enctype="multipart/form-data"文件上传的时候这个选项一定要选,用于识别文件和表单字段 -->
    <form action="UploadFileAction" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <br/>
        <input type="text" name="username" />
        <input type="submit" value="上传" />
    </form>
</body>
</html>



//转发的页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <img src="${filePath}">
    <img src="upload\20200608\7114556b-f6ea-45b3-8a26-6c0f194e6b37.jpg" />
  </body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值