zoukankan      html  css  js  c++  java
  • 文件上传与下载

    1、使用Servlet3.0的新特性实现文件上传

      实现文件上传需要以下两项内容:

      ①添加@MultipartConfig注解

      ②从request对象中获取Part文件对象

      @MultipartConfig注解需要标注在@WebServlet注释之上,@MultipartConfig注解的常用属性有如下:

    属性名

    类型 是否可选 描述

    fileSizeThreshold

    int 当数据量大于该值时,内容将被写入文件

    location

    String 存放临时生成的文件地址

    maxFileSize

    long 允许上传的文件最大值。默认值为-1,表示没有限制

    maxRequestSize

    long 针对该multipart/form-data请求的最大数量,默认值为-1,表示没有限制

      ③getPart(String name):name参数表示请求的name文件

      ④Collection<Part> geParts():

    @WebServlet("/uploadServlet")
    @MultipartConfig()
    public class UploadServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("你好");
            resp.setContentType("text/html;charset=UTF-8");
            //存储路径
            String savePath = req.getServletContext().getRealPath("/WEB-INF/uploadFile");
            System.out.println(savePath);
            Part part = req.getPart("file1");//获取用户上传的文件
            //servlet 3.0没有提供直接获取文件名的方法,需要从请求头中解析出来
            //如:Content-Disposition: form-data; name="file1"; filename="游戏王.png"
            String header = part.getHeader("Content-Disposition");//获取header
            //解析出文件名
            String fileName = ParseHeader.getFileName(header);
            part.write(savePath+ File.separator+fileName);
            System.out.println(fileName);
    
    
        }
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req,resp);
        }
    }
    //解析请求头,获取文件名( Content-Disposition: form-data; name="file"; filename="游戏王.png")
        public static String getFileName(String header){
            String[] headerParams = header.split(";");
            //在不同的浏览器下,数组里面的内容稍有区别
            //火狐或者google浏览器下:tempArr1={form-data,name="file",filename="游戏王.png"}
            //IE浏览器下:tempArr1={form-data,name="file",filename="E:游戏王.png"}
            String[] headerParam = headerParams[2].split("=");
            return headerParam[1].substring(headerParam[1].lastIndexOf("\")+1).replaceAll(""","");
        }

     2、使用Commons-FileUpload组件实现文件上传

      ①表单form配置:将enctype属性设置为multipart/form-data

      ②添加文件域:<input type="file" name="file" size="尺寸" />

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String adjunctname;
            String fileDir = "e:/file";//指定上传文件的保存路径
            String message = "文件上传成功";
            String address = "";
            if(ServletFileUpload.isMultipartContent(req)){//判断是否是上传文件
                DiskFileItemFactory factory = new DiskFileItemFactory();
                factory.setSizeThreshold(20*1024);//设置内存中允许存储的字节数
                factory.setRepository(factory.getRepository());//设置存放临时文件的目录
                ServletFileUpload upload = new ServletFileUpload(factory);//创建新的上传文件句柄
                int size = 2*1024*1024;//指定上传文件的大小上限
                List<FileItem> formLists = null;
                try {
                    formLists = upload.parseRequest(req);//获取上传文件的集合
                }catch (FileUploadException e){
                    e.printStackTrace();
                }
                for (FileItem fileItem : formLists) {
                    if (!fileItem.isFormField()){//忽略不是文件域的表单域
                        String fileName = fileItem.getName();//获取上传文件的名称
                        if(fileItem.getSize()>size){
                            message = "您上传的文件太大,请选择不超过2M的文件";
                            break;
                        }
                        String adjunctsize = Long.toString(fileItem.getSize());//获取上传文件的大小
                        if((fileName==null) || (fileName.equals("")) && (adjunctsize.equals("0"))) {//如果上传文件为空
                            continue;
                        }
                        adjunctname = fileName.substring(fileName.lastIndexOf("\"),fileName.length());
                        address = fileDir + File.separator + adjunctname;
                        File saveFile = new File(address);
                        try {
                            fileItem.write(saveFile);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                req.setAttribute("result",message);//将提示信息保存在request对象中
            RequestDispatcher requestDispatcher = req.getRequestDispatcher("index.jsp");
            requestDispatcher.forward(req,resp);
     } }

    3、Spring文件上传

      使用spring实现文件上传功能,首先需要在DispatcherServlet上下文中添加分段文件解析器。这样,每个请求就会被检查是否包含上传文件,如果有,则应用上下文中已经定义的MultipartResolver就会被调用。

      ①在dispatcher-servlet.xml中配置文件上传解析器

      

    <bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="defaultEncoding" value="UTF-8" /> //设置编码格式
            <property name="maxUploadSize" value="50000" /> //限制上传文件大小
            <property name="uploadTempDir" value="upload/temp" /> //设置临时文件夹
    </bean>

      ②定义上传表单页面

    <form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
    上传文件:<input type="file" name="uploadFileName" value="" /><br/>
    <input type="submit" value="上传" />
    <input type="reset" value="重置" />
    </form>

      ③编写文件上传控制器

      

    @Controller
    public class FileUploadController {
        @RequestMapping("/upload")
        public String fileUpload(MultipartFile multipartFile, HttpSession session) throws Exception{
            if(multipartFile.getSize()>0){//如果没有选择文件,则跳转到错误页面
                //获取文件名
                String fileName = multipartFile.getName();
                if(fileName.endsWith("jpg")||fileName.endsWith("gif")){//限制上传类型
                    String path = "d:/file";
                    File localFile = new File(path+File.separator+fileName);
                    multipartFile.transferTo(localFile);
                }
            }
    
        return null;
        }
    }

      

  • 相关阅读:
    vue之下拉菜单Dropdown的使用
    elinput输入框的readonly属性
    通过CollectionUtils工具类判断集合是否为空,通过StringUtils工具类判断字符串是否为空
    前端与后端之间参数的传递与接收和@RequestBody,@Requestparam,@Param三个注解的使用
    为什么数据库能查出两条id相同的数据
    js中函数调用时,对参数个数和类型没有要求
    避免创建不需要的对象,消除过期对象的引用
    避免使用终结方法
    避免使用终结方法
    快速排序
  • 原文地址:https://www.cnblogs.com/a591378955/p/8202861.html
Copyright © 2011-2022 走看看