二阶段补充:文件上传服务端处理,后端文件上传、前端两种文件上传方式

1.文件上传

2.后端文件上传

两种方案:

  1. 兼容性较好的commons-fileupload,支持所有版本的Servlet,即所有版本的Tomcat
  •  优点:
    •   兼容性           
  • 缺点
    •   需要外部jar,比较麻烦。代码处理也麻烦。
  1. 使用Servlet3.0 (Tomcat7之后)之后的文件上传方案。
  •  优点:
    •  代码简单不需要外部依赖。
  • 缺点:
    • 兼容性差—点

  1. 文件上传必须配置注解:doPost方法
    1. @MultipartConfig()
      1. localtion:设置文件上传的存储的临时文件
      2. fileSizeThreshold:文件大小超过规定则存在临时文件
      3.  maxFileSize 单个文件的最大值
      4. maxRequestSize一个请求的最大值
  2. 获取上传的文件对象,参数是上传文件的key Part file = req.getPart("file");
  3. 设置文件的保存路径将文件保存到项目的运行目录下
    1. private SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/mm/dd");                     //根据日期每天生成不同的目录进行存储,同一个目录文件多会卡顿                      String format = sdf.format(new Date());                                                                    String realPath = req.getServletContext().getRealPath("/img")+ format;
  4. 给文件重命名:因为相同文件名是不能保存的
    1. file.getSubmittedFileName();获取文件名
    2. 获得旧文件的尾缀oldName:
    3. 生成新文件newName
  5. 保存文件file.write(realPath+newName);
  6. 生成文件的访问路径//"http://localhost:8081/fileupload/img"+format+newName
    1. String url =  req.getScheme() + "://" +req.getServerName() + ":" + req.getServerPort() +  req.getContextPath() + "/img" + format + newName; 
package com.jason.fileupload.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@WebServlet(urlPatterns = "/fileupload")
//这个注解用来配置文件的上传信息
//localtion上传文件的临时保存目录:因为文件边读边写的,不可能一下只把1g的东西加载到内存,要一个临时文件边读边写
//fileSizeThreshold,文件临时存储大小的临界值,比如说超过1024才存到临时文件
//maxFileSize 单个文件的最大值
//maxRequestSize整个请求的最大值,一个请求可以选多个文件,这个请求的最大值

@MultipartConfig(location = "C:\\Users\\25139\\Desktop",fileSizeThreshold = 1024)
public class FileuploadServlet extends HttpServlet {
    /**
     * 1.文件上传必须是post请求
     * 2.文件上传的解析也可以使用io流
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    //对文件夹进行分类,按日期分类,别少了//
    private SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/mm/dd");
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.提取请求中的不同参数
        String username = req.getParameter("username");
        System.out.println("username="+username);
        //2.获取上传文件的保存路径fastDFS,或者是购买云服务商的对象存储服务oos。
        //将文件保存到项目的运行目录下
                                                //绝对路径下的/img
        String format = sdf.format(new Date());
        String realPath = req.getServletContext().getRealPath("/img")+ format;
        //这个路径可能不存在,如果不存在,就创建这个路径
        File folder = new File(realPath);
        if (!folder.exists()){
            folder.mkdirs();
        }

        //3.获取上传的文件对象,参数是上传文件的key
        Part file = req.getPart("file");
        //4.给文件重命名:因为相同文件名是不能保存的
        //首先要获取旧的文件名,从这个旧的文件名中获取后缀,在放到新的文件名中
        String submittedFileName = file.getSubmittedFileName();
        //获取文件名的后缀.jpg .png
        String suffix = submittedFileName.substring(submittedFileName.lastIndexOf("."));
        //生产新的文件名
        String newName = UUID.randomUUID().toString() + suffix;
        //5.保存文件,参数是文件路径
        file.write(realPath+newName);
        //6.生成文件的访问路径
        //"http://localhost:8081/fileupload/img"+format+newName
        //
        String url =
                //获取请求协议
                req.getScheme() + "://" +
                //获取服务器名称
                req.getServerName() + ":" +
                //获取端口
                req.getServerPort() +
                //获取上下文路径(项目名称)
                req.getContextPath() +
                "/img" + format + newName;
    }
}

 

二阶段补充:文件上传服务端处理,后端文件上传、前端两种文件上传方式_第1张图片

 3.前端两种文件上传方式

3.1表单提交方式

enctype="multipart/form-data">

3.2ajax提交数据

        javascript有files属性

        //【0】转javascript有个属性files拿得到所有文件【0】表示单个文件
        let file = $("#file")[0].files[0];
        //创建formData 对象用来保存参数
        let formData = new FormData();
        formData.append("username",username);
        formData.append("file",file);




    
    文件上传
    



    



 

你可能感兴趣的:(JAVEWEB,java)