ETJava Beta | Java    注册   登录
  • 原始上传文件两种方式

    发表于 2024-03-30 01:11:39     阅读(192)     博客类别:J2SE

    一个完整的文件上传功能包含了前端页面和服务端代码
    前端页面:
        在做文件上传的时候 会有一个上传文件的页面,首先我们需要一个表单,并且表单的请求方式为post,其次我们的form表单的enctype必须设置为multiparty/form-data  即 enctype="multiparty/form-data" 意思是设置表单类型为文件上传表单,默认情况下form表单的类型是application/x-www-form-urlencoded 不能用在文件上传上边,只能作为普通表单进行数据传输

    针对文件上传有多种方式,这里整理两种常用方式

    上传文件方式1.

        页面上传表单

    <form id="form1" action="${pageContext.request.contextPath}/admin/user/save.do" 
        method="post" enctype="multipart/form-data">
        头像:<input type="file" id="imageFile" name="imageFile"/>
    </form>

        后台处理

    @RequestMapping("/save")
        public void save(@RequestParam(value = "imageFile",required = false) MultipartFile imageFile, User user,
                           HttpServletRequest request, HttpServletResponse response)throws Exception{
            if(!imageFile.isEmpty()){
                // 获取项目访问路径
                String filePath=request.getServletContext().getRealPath("/");
                // 拼接文件名   
                // imageFile.getOriginalFilename().split("\\.")[1] 截取原文件的后缀
                String imageName= DateUtil.getCurrentDateStr()+"."+imageFile.getOriginalFilename().split("\\.")[1];
                // 将头像上传到指定目录
                imageFile.transferTo(new File(filePath+"static/userImages/"+imageName));
                user.setImageName(imageName);
            }
            int resultTotal=userService.updateUser(user);
            StringBuffer result=new StringBuffer();
            if(resultTotal>0){
                result.append("<script language='javascript'>alert('修改成功!');</script>");
            }else{
                result.append("<script language='javascript'>alert('修改失败!');</script>");
            }
            ResponseUtil.write(response, result);
        }

    上传文件方式2.

        上传表单不变 我们还是使用方式1的表单

        上传后台处理代码

    后台实现
        使用@MultipartConfig注解将一个Servlet标注为支持文件上传的Servlet
           标注后Servlet会将multipart/form-data的post请求封装成part对象,
           我们通过part对象就可以对上传的文件进行操作了

           如果使用的不是Servlet 则无需添加@MultipartConfig注解

        

    package com.et.upload;
    
    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.IOException;
    
    @WebServlet("/uploadServlet")
    @MultipartConfig // 标注支持文件上传
    public class UploadFile extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            // 设置请求的编码格式 - 防止请求中有中文出现乱码
            req.setCharacterEncoding("UTF-8");
            // 获取普通表单
            String name = req.getParameter("name");
            System.out.println("name = "+name);
            // 获取Part对象
            Part part = req.getPart("myfile");
            // 获取上传的文件名  * tomcat7没有提供getSubmittedFileName方法获取文件名 需要替换为下面截取的方式 tomcat8有提供
    //       String fileName = part.getSubmittedFileName();
            String cd = part.getHeader("Content-Disposition");
            //获取文件名 截取不同类型的文件需要自行判断
            String fileName = cd.substring(cd.lastIndexOf("=")+2, cd.length()-1);
            // 获取当前项目路径 即文件上传后需要存放的路径
            String path = getServletContext().getRealPath("/");
            System.out.println("文件保存地址:"+path+"\\"+fileName);
            // 将文件上传到指定的位置
            part.write(path+"/"+fileName);
        }
    }