06-文件上传

文件上传

实现原理

在这里插入图片描述

使用类介绍

ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FikeItem对象,在使用ServletFileUpdload对象解析请求时需要DIskFileItemFactory对象。所以我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置SevletFileUpload对象的fileItemFactory属性

01-准备工作

对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器的。

一般选择采用apache的开源工具common-fileupload这个组件上传

02-网页支持

<%--通过表单上传文件
    get:上传大小有限制
    post:上传大小没有限制
    必须要有enctype这个属性设置
--%>
<form enctype="multipart/form-data" action="" method="post">
    <p><input type="file"></p>
    <input type="submit">
</form>

03-servlet编写

package com.XZY_SUNSHINE.down;
import javax.servlet.ServletException;
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;

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;

public class downServlet extends HttpServlet {
    
    

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        System.out.println("......");
        //判断上传文件是普通的表单还是带文件的表单
        if (!ServletFileUpload.isMultipartContent(request)){
    
    
            return;//进入if说明是普通的文件我们返回什么都不做即可
        }//如果通过了这个if说明我们的表单是带文件上传的
        //创建文件上传的保存路径
        String uploadPath="e:\\java\\Upload";
        File file = new File(uploadPath);
        if (!file.exists()){
    
    
            //通过目录不存在,创建一个这样的目录
            file.mkdir();
        }
        //缓存,临时文件路径
        //假如文件超过了预期的大小,我们就把他放到一个临时文件中,过几天就自动清除
        String tempPath="e:\\java\\temp";
        File tempfile = new File(tempPath);
        if (!tempfile.exists()){
    
    
            //通过目录不存在,创建一个这样的目录
            tempfile.mkdir();
        }
        //处理上传文件
        //1.创建DiskFileItemFactory对象,处理上传路径和大小限制
        DiskFileItemFactory factory=new DiskFileItemFactory();
        factory.setRepository(tempfile);//临时保存目录

        //2.获取ServletFileUpload
        ServletFileUpload upload = new ServletFileUpload(factory);

        //监听文件上传进度:平时见的进度条
        upload.setProgressListener(new ProgressListener() {
    
    
            @Override
            //pBytesRead:已经读取到文件的大小
            //pContentLength:文件大小
            public void update(long pBytesRead, long pContentLength, int pitems) {
    
    
                System.out.println("总大小:"+pContentLength + "  已上传:"+pBytesRead);
            }
        });
        upload.setHeaderEncoding("utf-8");//处理乱码问题
        //3.处理上传文件
        try {
    
    
            //把前端请求封装成一个fileitem对象
            List<FileItem> fileItems=upload.parseRequest(request);
            for (FileItem fileitem:fileItems) {
    
    
                if (!fileitem.isFormField()){
    
    //判断是不是上传文件
                    String uploadname=fileitem.getName();
                    //获取文件名
                    String filename=uploadname.substring(uploadname.lastIndexOf("/")+1);
                    //获取文件后缀名
                    String fileextname=uploadname.substring(uploadname.lastIndexOf(".")+1);
                    //获取uuid:唯一辨识符
                    String uuidpath= UUID.randomUUID().toString();
                    String realpath=uploadPath+"/"+uuidpath;
                    File realpathfile = new File(realpath);
                    if (!realpathfile.exists()){
    
    
                        realpathfile.mkdir();
                    }

                    //获取文件的输入流
                    InputStream inputStream = fileitem.getInputStream();
                    int len=0;
                    byte[] buffer=new byte[1024*1024];
                    FileOutputStream fileOutputStream = new FileOutputStream(realpath + "/" + filename);
                    while((len=inputStream.read(buffer))>0){
    
    
                        fileOutputStream.write(buffer,0,len);
                    }
                    fileOutputStream.close();
                    inputStream.close();
                    fileitem.delete();
                    System.out.println("上传成功!");
                    System.out.println("..");

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

}

04-xml配置

<servlet>
        <servlet-name>upload</servlet-name>
        <servlet-class>com.XZY_SUNSHINE.down.downServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>upload</servlet-name>
        <url-pattern>/upload</url-pattern>
    </servlet-mapping>

猜你喜欢

转载自blog.csdn.net/qq_52117201/article/details/129404416