分享

Servlet中文件上传的几种方式

 一本正经地胡闹 2019-07-05

  上传文件,因为上传的都是二进制数据,所以在Servlet中就不能直接用request.getParameter();方法进行数据的获取,需要借助第三方jar包对上传的二进制文件进行解析。常用的方式如下:

一:使用SmartUpload.jar

  它是一个商业类库,解析request过程中,数据是存放在内存中的,因此速度比较快,但是上传大文件的时候会出现内存溢出。

二:commons-fileupload.jar (Apache commons)、commons-io.jar

UploadFileServlet .java
复制代码
public class UploadFileServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("请以POST方式访问该URL");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求和响应的编码格式
        String encoding = getServletContext().getInitParameter("encoding");
        req.setCharacterEncoding(encoding);
        resp.setCharacterEncoding(encoding);
        resp.setContentType("text/html");
        
        //核心Api
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        
        //判断是否是muitipart/form-data类型
        if(!ServletFileUpload.isMultipartContent(req)) {
            resp.getWriter().println("表单的enctype属性不是multipart/form-data类型");
        }
        
        //设置单个文件上传大小 2M
        fileUpload.setFileSizeMax(2*1024*1024); 
        //设置总上传文件大小(有时候一次性上传多个文件,需要有一个上限,此处为10M)
        fileUpload.setSizeMax(10*1024*1024);
        //设置上传监听器[参数为自定义的监听器]
        fileUpload.setProgressListener(new ListenerUploadProgress());
        //解析请求
        try {
            List<FileItem> parseRequest = fileUpload.parseRequest(req);
            //获取数据
            for (FileItem fileItem : parseRequest) {
                //判断数据类型是不是普通的form表单字段
                if(!fileItem.isFormField()) {
                    //上传文件
                    String fileName = fileItem.getName();
                    InputStream fileStream = fileItem.getInputStream();
                    //定义保存的父路径
                    String parentDir = this.getServletContext().getRealPath("/WEB-INF/upload");
                    //使用UUID+文件名的方式,避免文件重名
                    String realFileName = UUID.randomUUID().toString()+"-"+fileName;
                    //创建要保存的文件
                    File file = new File(parentDir,realFileName);
                    //判断文件夹是否存在
                    if(!file.getParentFile().exists()) {
                        //创建文件夹[多级文件夹]file.madir是创建单一文件夹
                        file.getParentFile().mkdirs();
                    }
                    
                    //创建输出流
                    OutputStream out = new FileOutputStream(file);
                    //创建字节缓存
                    byte[] buffer = new byte[1024];
                    int len = -1;
                    //一次读取1kb(1024byte),返回-1表明读取完毕
                    while((len = fileStream.read(buffer))!=-1) {
                        //一次写入1kb(1024byte)
                        out.write(buffer,0, len);
                    }
                    
                    //冲刷流资源
                    out.flush();
                    //关闭流
                    out.close();
                    fileStream.close();
                    
                }else {
                    //普通字段
                    
                    //字段名
                    String fieldName = fileItem.getFieldName();
                    //字段值
                    String fieldValue = fileItem.getString();
                    System.out.println(fieldName+":"+fieldValue);
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }        
    }
}
复制代码
ListenerUploadProgress.java
复制代码
public class ListenerUploadProgress implements ProgressListener {
    
    /**
     * @param bytesRead 已经读取的字节数
     * @param contentLength 文件总长度
     * @param items 当前上传的是哪个文件
     */
    @Override
    public void update(long bytesRead, long contentLength, int items) {
        System.out.println(bytesRead);
        System.out.println(contentLength);
        System.out.println(items);
    }
    
    //*前端可以根据该信息写一个上传进度条
}
复制代码

 

 https://www.cnblogs.com/wooyoohoo/p/9464570.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多