zoukankan      html  css  js  c++  java
  • 网络上传文件功能实现步骤总结

    文件上传步骤

    1. 导包

    导入commons-iocommons-fileupload jar包

    2. 前端页面

    action:页面请求,需和web.xml中匹配

    method:设置为post,没有文件大小限制

    enctype:值为multipart/form-data用于识别是否为文件表单还是普通文本表单

    <form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">
        <input type="file" name="file1">
        <br>
        <input type="file" name="file2">
        <br>
        <input type="submit">
        <br>
    </form>
    

    3. 注册web.xml

        <servlet>
            <servlet-name>FileUploadServlet</servlet-name>
            <servlet-class>com.juyss.servlet.FileUploadServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>FileUploadServlet</servlet-name>
            <url-pattern>/upload.do</url-pattern>
        </servlet-mapping>
    

    4. 编写Servlet

    实现步骤

    1. 判断表单为普通文本表单还是文件表单

    2. 创建上传文件的保存根路径

    3. 创建临时文件的保存根路径

    4. 获取FileItem对象

      ​ 需要ServletFileUpload对象

      ​ 需要用到DiskFileItemFactory对象,用于处理上传路径和限制文件大小

    5. 通过FileItem对象获取文件名,文件后缀

    6. 使用UUID创建唯一保存路径

    7. 使用fileItem.getInputStream()获取文件输入流

    8. 创建文件输出流FileOutputStream fos = new FileOutputStream(savePath + "/" + fileName)

    9. 关闭流资源,同时删除临时文件fileItem.delete()

    public class FileUploadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            System.out.println("进入了FileUploadServlet.class");
    
            //判断表单是否为带有文件的表单
            if (!ServletFileUpload.isMultipartContent(request)) {
                return; //终止方法运行
            }
    
            //定义文件上传后保存的根路径
            String rootPath = this.getServletContext().getRealPath("/WEB-INF/upload");
            File rootFile = new File(rootPath);
            if (!rootFile.exists()) {
                rootFile.mkdir();
            }
    
            //定义文件缓存路径
            String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
            File tempFile = new File(tempPath);
            if (!tempFile.exists()) {
                tempFile.mkdir();
            }
    
            //创建DiskFileItemFactory对象,处理上传路径和限制文件大小
            DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(1024 * 1024, tempFile);
    
            //创建ServletFileUpload对象
            ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
    
            //获取FileItem对象
            List<FileItem> fileItems = null;
            try {
                fileItems = servletFileUpload.parseRequest(request);
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
            if (fileItems==null){
                System.out.println("fileItem空指针");
                return;
            }
            Iterator<FileItem> iterator = fileItems.iterator();
    
            //遍历fileItems集合
            while (iterator.hasNext()) {
                FileItem fileItem = iterator.next();
                if (fileItem.isFormField()) {//是普通文本表单
                    continue; //跳出循环
                } else {//是文件表单
                    //获取文件字段名,标签中name属性的值
                    String fieldName = fileItem.getFieldName();
                    //获取文件上传字段中的文件名,一般来说为为文件名(不包含路径信息),在opera浏览器中可能会包含文件路径信息
                    String name = fileItem.getName();
                    System.out.println("文件字段名:"+fieldName);
                    System.out.println("文件名:"+name);
    
                    //判断文件名是否合法
                    if (name.trim().equals("") || name == null) {
                        continue;
                    }
    
                    //获取文件名和文件后缀
    
                    String fileName; //文件名
                    if (name.contains("/")){ //判断name是否包含路径信息
                        fileName = name.substring(name.lastIndexOf("/"));
                    }else{
                        fileName = name;
                    }
    
                    String fileExtension = fileName.substring(fileName.indexOf(".") + 1);//获取文件后缀
                    System.out.println("文件名:" + fileName);
                    System.out.println("文件类型:" + fileExtension);
                    //获取随机UUID
                    String uuid = UUID.randomUUID().toString();
    
                    //使用uuid创建唯一的文件夹作为文件存放路径
                    String savePath = rootPath + "/" + uuid; //文件存放路径
                    File savePathFile = new File(savePath);
                    if (!savePathFile.exists()) { //路径不存在就创建
                        savePathFile.mkdir();
                    }
    
                    //获取输入流读取上传的文件
                    InputStream is = fileItem.getInputStream();
    
                    //用输出流保存到本地
                    FileOutputStream fos = new FileOutputStream(savePath + "/" + fileName);
    
                    int len;
                    byte[] bytes = new byte[1024 * 1024];
                    while((len = is.read(bytes))!=-1){
                        fos.write(bytes,0,len);
                    }
    
                    fos.close();
                    is.close();
                    //删除临时文件
                    fileItem.delete();
                }
            }
    
    
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    
    
  • 相关阅读:
    A4纸网页打印 html网页页面的宽度设置成多少
    怎样使用 css 的@media print控制打印
    jquery 表格自动拆分(方便打印)插件-printTable
    【转】编写高质量代码改善C#程序的157个建议——建议107:区分静态类和单例
    【转】编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数
    【转】编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句
    【转】编写高质量代码改善C#程序的157个建议——建议103:区分组合和继承的应用场合
    【转】编写高质量代码改善C#程序的157个建议——建议102:区分接口和抽象类的应用场合
    【转】编写高质量代码改善C#程序的157个建议——建议101:使用扩展方法,向现有类型“添加”方法
    【转】编写高质量代码改善C#程序的157个建议——建议100:静态方法和实例方法没有区别
  • 原文地址:https://www.cnblogs.com/shmebluk/p/13332306.html
Copyright © 2011-2022 走看看